日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链表合并

發(fā)布時間:2025/6/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表合并 小編覺得挺不錯的,現(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){??
  • ????//如果第一個鏈表是空鏈表返回鏈表2頭結點???
  • ????if(headOne?==?NULL){??
  • ???????return?headTwo;??
  • ????}??
  • ????//如果第二個鏈表是空鏈表返回鏈表1頭結點???
  • ????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){??
  • ????//鏈表1為空???
  • ????if(headOne?==?NULL){??
  • ????????return?headTwo;??
  • ????}??
  • ????//鏈表2為空???
  • ????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)容還不錯,歡迎將生活随笔推薦給好友。