1. 程式人生 > >小菜雞想成為演算法大神

小菜雞想成為演算法大神

題目:已知單鏈表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;