劍指 25 合併兩個排序的列表

2021-10-12 01:12:12 字數 1702 閱讀 3913

輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是遞增排序的。

示例1:

輸入:1

->2-

>4,

1->3-

>

4輸出:1

->1-

>2-

>3-

>4-

>

4

遞迴

這個問題就像是串糖葫蘆。給了兩個排序的鍊錶=兩盆由小到大排序的山楂,那麼首先要確定頭結點=第乙個穿到串上的,頭結點確定好了之後就相當於每次從兩個盆裡各拿乙個最小的山楂來比較,把小的那個穿到串上。以示例中的兩個鍊錶為例:

鍊錶1:1

->2-

>

4鍊錶2:1

->3-

>

4首先要確定第乙個頭結點 1(假設兩個結點相等時,我們選擇第二個鍊錶上的)

----

----

----

----

鍊錶1:2

->

4鍊錶2:1

->3-

>

4合併鍊錶:1

->

接下來就是再比較兩個鍊錶的首節點,確定合併鍊錶的下一節點

----

----

----

----

鍊錶1:2

->

4鍊錶2:3

->

4合併鍊錶:1

->

1

流程就是這樣,當某乙個鍊錶中的節點全被取出時,另乙個鍊錶的剩餘部分直接拼到合併鍊錶的尾部,合併結束。

指標l1l2是兩個排序鍊錶的頭結點指標,p1p2是分別指向當前要對比的兩個鍊錶中的節點,head是合併後的煉表頭結點指標

class

solution_1

else

listnode *cur = head;

//決定頭結點之後的其他節點

while

(p1 !=

nullptr

&& p2 !=

nullptr

)else

cur = cur-

>next;}if

(p1 ==

nullptr

&& p2==

nullptr

)return head;

else

if(p1 ==

nullptr

) cur-

>next = p2;

else

if(p2 ==

nullptr

) cur-

>next = p1;

return head;}}

;

這道題如果意識到頭結點的操作與後面節點的操作並沒有什麼不同,就可以很大程度上簡化**了。

劍指上給出了一種遞迴的解法,每次傳入遞迴函式的兩個指標是變化的,遞迴的好處就是邏輯清晰,**簡潔,這比自己想的少用了好多指標。

class

solution

else

return head;}}

;

劍指 25 合併兩個排序的鍊錶

題目描述 演算法分析 提交 class solution listnode merge2 listnode phead1,listnode phead2 else listnode newhead currnode while p1 p2 else currnode currnode next wh...

劍指Offer(書) 合併兩個排序的列表

題目 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。遞迴版本 public listnode merge listnode list1,listnode list2 if list2 null listnode mergehead null if lis...

劍指Offer NO 16 合併兩個排序的列表

題目描述 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。解題思路 使用遞迴方法 新建乙個鍊錶reslist用作輸出結果,輸入鍊錶為list1和list2,當list1.val反之,reslist list2,reslist.next merge list...