鍊錶 21 合併兩個有序鍊錶

2022-08-10 17:42:14 字數 1624 閱讀 6231

題目:

將兩個公升序鍊錶合併為乙個新的公升序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。 

示例:輸入:1->2->4, 1->3->4

輸出:1->1->2->3->4->4

解體方法:暴力法和遞迴:

暴力法思路:

首先鍊錶這種資料結構是乙個只能從頭訪問的,本題中,因為兩個鍊錶中的頭節點都要先進行比較之後才能確定最後輸出的節點誰是頭節點,這種情況在鍊錶中比較普遍,所以我們可以new乙個dummy節點出來,在設定乙個pre節點進行遍歷,最後返回dummy.next即可。

**如下:

class

solution

else

pre=pre.next; //

移動到下乙個指標出

} pre.next=l1==null?l2:l1;

return dummy.next; //

最後返回dummy.next

}}

複雜度分析:

時間複雜度:o(n+m):最壞的情況下我們需要遍歷兩條鍊錶所有節點。

空間複雜度:o(1):只需要new乙個dummy節點

遞迴法思路:

遞迴遞迴,一看就會一寫就廢。。。。

考慮遞迴結束條件:當l1和l2中任意乙個鍊錶為空時就結束;

上面就是洋蔥一層一層深入過程,可以很輕鬆的進行遞迴建模  min(val).next=mergetwolists(min.next, other);

上面就是返回的時候,每次比較的較小值作為上一層洋蔥要鏈結的值,也是是需要返回的值:min(val).next=mergetwolists(min.next, other)中mergetwolists(min.next, other)需要返回的是min.next和other中val較小的指標!

所以我們可以寫出**:

class

solution

if(l2==null

)

if(l1.val<=l2.val)

else}}

複雜度分析:

時間複雜度:o(m+n):最壞的情況下需要遍歷比較兩條鍊錶所有的節點

空間複雜度:o(m+n):在每層剝洋蔥的過程中需要用棧儲存每層返回的指標,最壞的情況下需要m+n個

總結:可以看出遞迴的優勢不在於效能,而在於**簡潔,乙個典型的用時間換空間的演算法。

21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 原本想的是用19題的結構陣列那種方法來做 分別遍歷兩個鍊錶,建立結構儲存原始索引,val和指標,氣泡排序這個結構,更新索引,按照索引建立新的n...

21 合併兩個有序鍊錶

合併兩個有序鍊錶 將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4輸出 1 1 2 3 4 4比較簡單,比較大小,重新排序即可。created by hints on 2019 1 9.include using name...

21 合併兩個有序鍊錶

將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4先確定合併鍊錶第乙個節點 在迴圈中同時遍歷兩個鍊錶,將後面其餘節點逐次比較,依大小次序連線到首節點之後,迴圈結束後可能有乙個鍊錶未遍歷完,將這個鍊錶剩...