力扣 - 劍指 Offer 25. 合併兩個排序的連結串列
阿新 • • 發佈:2021-11-19
題目
思路1
- 其實就是歸併排序中將兩個數組合併成一個有序陣列
- 因為兩個連結串列的元素已經是遞增了(必要條件),所以我們可以遍歷兩個連結串列,判斷兩個節點的大小關係,然後交替前進,合併到一個新的連結串列中
- 因為需要返回一個合併後的新連結串列,同時我們也無法判斷
l1
、l2
兩個連結串列的值大小,因此我們可以建立一個虛擬頭節點dummy
,相當於用來標識這個連結串列,這樣最後的結果就是虛擬頭節點的下一個節點dummy.next
了
程式碼
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { // 建立一個虛擬頭節點 ListNode dummy = new ListNode(-1); ListNode temp = dummy; // 就是歸併排序裡的將兩個數組合併成一個有序陣列 // 要保證這兩個連結串列都是有效的,及不為空 // 如何判斷大小進行合併,注意這裡要重新建立節點 while (l1 != null && l2 != null) { if (l1.val < l2.val) { temp.next = new ListNode(l1.val); temp = temp.next; l1 = l1.next; } else { temp.next = new ListNode(l2.val); temp = temp.next; l2 = l2.next; } } // 判斷兩個連結串列是否都遍歷完 while (l1 != null) { temp.next = new ListNode(l1.val); temp = temp.next; l1 = l1.next; } while (l2 != null) { temp.next = new ListNode(l2.val); temp = temp.next; l2 = l2.next; } // 答案就是虛擬頭節點的next下一個節點 return dummy.next; } }
複雜度分析
- 時間複雜度:\(O(M+N)\),M、N分別為
l1
、l2
兩個連結串列的長度 - 空間複雜度:\(O(1)\)