小菜雞想成為演算法大神
阿新 • • 發佈:2018-12-18
題目:已知單鏈表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;