生活随笔
收集整理的這篇文章主要介紹了
链表合并
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目: 輸入兩個遞增排序的鏈表,要求把兩個鏈表和并成一個鏈表并且使得新鏈表也是遞增排序的。
分析:
1. 假設兩個鏈表如下所示
? ??
2. 要合并兩個鏈表,可以利用歸并排序的合并思想,從頭枚舉兩個鏈表,判斷兩個指針指向的兩個結點的值關系。
? ?(1)初始化兩個指針p1,p2分別指向兩個鏈表的頭結點,合并之后新的鏈表頭結點肯定是兩個鏈表中值較小的那個
? ?(2)每一次比較兩個指針指向的結點值的大小,如果p1較小則把p1指向結點加入新鏈表,否則加入p2指向的結點。直到有一個鏈表為空,然后把剩下的所有結點全部加入新鏈表即可
3. 代碼(歸并排序思想)
[cpp]?view plaincopy
?? struct?ListNode{?? ????int?value;?? ????ListNode?*nextNode;?? };??? ?? ?? ListNode*?MergeList(ListNode?*headOne,?ListNode?*headTwo){?? ?????? ????if(headOne?==?NULL){?? ???????return?headTwo;?? ????}?? ?????? ????if(headTwo?==?NULL){?? ???????return?headOne;??? ????}?? ?????? ????ListNode?*p1?=?headOne;?? ????ListNode?*p2?=?headTwo;?? ????ListNode?*newHeadNode?=?NULL;?? ?????? ????if((p1->value)?<=?(p2->value)){?? ???????newHeadNode?=?p1;?? ???????p1?=?p1->nextNode;?? ????}??? ????else{?? ???????newHeadNode?=?p2;?? ???????p2?=?p2->nextNode;??????? ????}?? ?????? ????ListNode?*curNode?=?newHeadNode;?? ?????? ????while((p1?!=?NULL)?&&?(p2?!=?NULL)){?? ???????if((p1->value)?<=?(p2->value)){?? ???????????curNode->nextNode?=?p1;?? ???????????curNode?=?curNode->nextNode;?? ???????????p1?=?p1->nextNode;?? ???????}?? ???????else{?? ???????????curNode->nextNode?=?p2;?? ???????????curNode?=?curNode->nextNode;?? ???????????p2?=?p2->nextNode;?????????? ???????}?? ????}??? ?????? ?????? ????while((p1?!=?NULL)){?? ???????curNode->nextNode?=?p1;?? ???????curNode?=?curNode->nextNode;?? ???????p1?=?p1->nextNode;??? ????}??? ????while(p2?!=?NULL){?? ???????curNode->nextNode?=?p2;?? ???????curNode?=?curNode->nextNode;?? ???????p2?=?p2->nextNode;?? ????}?? ?????? ????return?newHeadNode;?? }???
遞歸代碼,更加簡潔
[cpp]?view plaincopy
struct?ListNode{?? ????int?value;?? ????ListNode?*nextNode;?? };??? ?? ?? ListNode*?MergeList(ListNode?*headOne,?ListNode?*headTwo){?? ?????? ????if(headOne?==?NULL){?? ????????return?headTwo;?? ????}?? ?????? ????if(headTwo?==?NULL){?? ????????return?headOne;??? ????}?? ?????? ????ListNode?*newNode?=?NULL;?? ????if((headOne->value)?<=?(headTwo->value)){?? ????????newNode?=?headOne;?? ????????newNode->nextNode?=?MergeList(headOne->nextNode,?headTwo);?? ????}??? ????else{?? ????????newNode?=?headTwo;?? ????????newNode->nextNode?=?MergeList(headOne,?headTwo->nextNode);?? ????}?? ????return?newNode;?? } ??
總結
以上是生活随笔為你收集整理的链表合并的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。