天天看點

[劍指Offer]面試題25: 合并兩個排序的連結清單合并兩個有序連結清單

合并兩個有序連結清單

“Think ahead. Don't let day-to-day operations drive out planning.” — Donald Rumsfeld

題目描述

輸入兩個單調遞增的連結清單,輸出兩個連結清單合成後的連結清單,當然我們需要合成後的連結清單滿足遞增有序的規則。

示例1:

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

複制

限制:

0 <= 連結清單長度 <= 1000           

複制

解題思路一:遞歸法

  1. 由于連結清單是升序排列,如果連結清單1的頭結點小于連結清單2的頭結點的值,那麼連結清單1的頭結點就是合并後連結清單的頭結點。
  2. 并将下一層遞歸函數的傳回值,連結到目前結點的尾部。
  3. 遞歸終止條件:至少一個為空,傳回剩下的那個
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:

        if l1 == None:
            return l2
        if l2 == None:
            return l1
        
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2           

複制

解題思路二:雙指針比較

分别用指針l1, l2來周遊兩個連結清單,如果目前l1指向的資料小于l2指向的資料,則将l1指向的結點歸入合并後的連結清單,否則将l2指向的結點歸并到合并的連結清單中。

如果有一個連結清單周遊結束後,則把未結束的連結清單連接配接到合并連結清單後的連結清單尾部。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:

        if l1 == None:
            return l2
        if l2 == None:
            return l1

        if l1.val >= l2.val:
            head = l2
            l2 = l2.next
        else:
            head = l1
            l1 = l1.next
        
        cur = head
        while l1 and l2:
            if l1.val <= l2.val:
                cur.next = l1
                cur = cur.next
                l1 = l1.next
            else:
                cur.next = l2
                cur = cur.next
                l2 = l2.next

        if l1 == None and l2:
            cur.next = l2
        elif l2 == None and l1:
            cur.next = l1
        return head           

複制

解題思路三:虛拟頭結點

解題思想跟上述一樣,但是為了減少對每一個節點的不同情況進行考慮,可以考慮建立一個虛拟頭結點dummy(這是一個很常用的連結清單題的技巧),然後用一個真正在走的結點cur指向這個dummy,每一個cur都會選取正确的之連接配接在以dummy為頭結點的連結清單上。

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:

        dummy = cur = ListNode(0)

        while l1 and l2:
            if l1.val <= l2.val:
                cur.next = l1
                l1 = l1.next
            else:
                cur.next = l2
                l2 = l2.next
            cur = cur.next
        cur.next = l1 if l1 else l2
        return dummy.next           

複制

時間複雜度:

[劍指Offer]面試題25: 合并兩個排序的連結清單合并兩個有序連結清單

,m,n分别為連結清單l1, l2的長度

空間複雜度:

[劍指Offer]面試題25: 合并兩個排序的連結清單合并兩個有序連結清單
感謝你的閱讀,這裡是不斷學習中的yuzhou1su,keep coding, keep loving。