項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【Leetcode】python – [21] Merge Two Sorted Lists 個人解法筆記 (內含範例程式碼) 內含 Linked List 基本操作 (for 新手教學)

題目出處

21. Merge Two Sorted Lists

難度

easy

題目分類

Linked List, Recursion

Linked List 操作 (for 新手教學)

新手如我,最不熟悉 Linked List 的操作,剛好網路上有其他大神分享,
我們來簡單的重新敘述一下他教學的內容:

參考:Python3 Solution with a Detailed Explanation – dummy explained

pointer 跟著移動?

假設我們定義一個 head = temp = ListNode(0),
(這樣寫太難懂的話,請理解為 temp = ListNode(0), head = temp)

在 Linked List 操作中可能最讓人困惑的就是,當我們去移動 temp 時,head 會不會跟著移動?
在 python 裡面,我們進行 temp = temp.next 的動作,
實際上我們只有移動 「temp 指向的位置」,我們可以理解「temp.next」在此只是一個「位置的代稱」,
就像我們說
b = 1
a = b
b = 2
最後會知道 a = 1, b = 2 而不是 a, b = 2,

不要像作者我在一開始因為開始有點複雜,就被搞亂了。

好啊,那 pointer 不移動,為啥 temp 去改能影響到 head?

head 一開始指到的記憶體位置與 temp 是相同的,
而我們控制 temp 在此點的指向,因此 head 確實可以從這個記憶體位置往下找。

比喻

我們可以想像我們現在正在挖金礦,我們順著 線索 1 -> 2 -> 3 不斷往前,
但我們如果要告訴後來的人這條路該怎麼走,我們是必要紀錄起始點的位置。
因此這裡就會分為 head, temp, head 幫助我們保留起始位置,而 temp 負責幫我們移動。
中間的每一個線索都已經由 temp 在過程中建立好正確連結,
因此 head 尋著 temp 打通的道路再走一次,就是走 temp 開過的路。

ListNode(0)? return head.next

不用想那麼多,這只是建立一個供我們參考的基準點。
從我們最後 return head.next 就知道,我們只在乎這個基準點之後的事情。

個人範例程式碼

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        head = temp = ListNode(0)
        while list1 and list2: 
            if list1.val < list2.val:
                temp.next = list1 # ans next Node
                list1 = list1.next
            else:
                temp.next = list2 # ans next Node
                list2 = list2.next # move next
            temp = temp.next # ans move next
        temp.next = list1 or list2 # remain things
        return head.next

Time Complexity

O(m+n)

Space Complexity

O(1)

算法說明

如上面介紹所述

corner case 特殊情況處理

注意沒有值的情況,例如開頭就沒有的時候

Boundary conditions/ Edge conditions 邊際情況處理

終止條件

注意沒有值的情況,
我們大原則是每次都會檢查「this Node 是否為 None」再開始接續動作。

提取剩餘內容

另外最後的 list1 or list2 是個非常漂亮的做法,
可以快速把剩餘的內容提取出來。

Reference