1. 程式人生 > 其它 >力扣 - 劍指 Offer 25. 合併兩個排序的連結串列

力扣 - 劍指 Offer 25. 合併兩個排序的連結串列

題目

劍指 Offer 25. 合併兩個排序的連結串列

思路1

  • 其實就是歸併排序中將兩個數組合併成一個有序陣列
  • 因為兩個連結串列的元素已經是遞增了(必要條件),所以我們可以遍歷兩個連結串列,判斷兩個節點的大小關係,然後交替前進,合併到一個新的連結串列中
  • 因為需要返回一個合併後的新連結串列,同時我們也無法判斷l1l2兩個連結串列的值大小,因此我們可以建立一個虛擬頭節點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分別為l1l2兩個連結串列的長度
  • 空間複雜度:\(O(1)\)
我走得很慢,但我從不後退!