1.有序鏈表的合並
阿新 • • 發佈:2018-10-28
col 歸並 com C鏈表 small bubuko type 容易 struct
題目:已知單鏈表A,單鏈表B均為單調不減有序鏈表,請你寫出一個函數將這兩個單鏈表合並成一個新的有序鏈表C。
根據鏈表中結點的組成,很容易想到,此時無需再為C分配內存,只需使C的head指向A或B的head,再改變鏈表A,B中的指針域的值,使A和B按照順序被“串”起來即可。
如圖這個例子,充分說明了為何無需再分配空間:
有了這個大概思路,我們想一下該如何代碼實現
1.需要三個指針a,b,c,分別指向A,B待判斷大小的結點和C的末尾。先進行a,b所含值的大小判斷,再將較小的鏈接到C末尾。
2.確定C的head指向A,B中較小的一方。(???)
3.為了縮減時間,需要判斷是否有一個表的元素已經合並完,若有的話,只需將另一個表的剩余段鏈接在c所指的結點之後即可。
大家可以先自己寫一寫再來看我的思路,歡迎評論交流。
函數體如下:
1 void MergeList_L(List*a,List*b,List*c){ 2 //已知傳入的兩個鏈表均為非遞減序 3 //使合並成的C鏈表也為非遞減序 4 Node*A=a->head; 5 Node*B=b->head; 6 if (A->value>=B->value) { 7 c->head=b->head; 8 B=B->next; 9 } 10 else{ 11 c->head=a->head; 12 A=A->next; 13 } 14 //make sure C‘s header is the smaller one of A and B 15 Node*C=c->head; 16 17 while (A&&B) { 18 if (A->value>=B->value) { 19 C->next=B;B=B->next; 20 } 21 else{ 22 C->next=A;A=A->next; 23 } 24 C=C->next; 25 }//進行鏈接,並判斷有無鏈表被歸並完 26 C->next=A?A:B; 27 28 }
再附上頭文件
typedef struct _node{ int value; struct _node *next; }Node; typedef struct _list{ Node* head; }List;
1.有序鏈表的合並