1. 程式人生 > >1.有序鏈表的合並

1.有序鏈表的合並

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.有序鏈表的合並