题解 | #合并表记录#
合并表记录
https://www.nowcoder.com/practice/de044e89123f4a7482bd2b214a685201
#include <math.h> #include <stdio.h> #include <stdlib.h> static int *key_l,*vlu_l,*nxt_l; static int InsertIntoChain(unsigned int Priv,unsigned int New){ if(key_l[nxt_l[Priv]] > key_l[New]){ nxt_l[New] = nxt_l[Priv]; nxt_l[Priv] = New; return 0; } if(key_l[nxt_l[Priv]] == key_l[New]){ vlu_l[nxt_l[Priv]] += vlu_l[New]; return 0; } return 1; } int main(void){ int InputLines=0,temp_index=0,curr_key=0; scanf("%u",&InputLines); key_l = malloc((InputLines+1)*sizeof(unsigned int)*3); vlu_l = key_l + InputLines + 1; nxt_l = vlu_l + InputLines + 1; *key_l = -1; *nxt_l = 1; for(int i=1;i<=InputLines;i++){ scanf("\n%u %u",key_l+i,vlu_l+i); *(nxt_l+i) = 0; } for(int i=2;i<=InputLines;i++){ while(InsertIntoChain(temp_index,i)){ if(nxt_l[nxt_l[temp_index]] == 0){ nxt_l[nxt_l[temp_index]] = i; break; } temp_index = nxt_l[temp_index]; } temp_index = 0; } temp_index = nxt_l[0]; for(int i=1;i<=InputLines;i++){ printf("%d %d\n",key_l[temp_index],vlu_l[temp_index]); temp_index = nxt_l[temp_index]; if(temp_index == 0) break; } }
用三个数组模拟一个链表,通过链表进行排序和输出。