題目連結:https://leetcode.com/problems/merge-two-sorted-lists/
題目敘述:
測資的 Input/Output:
會拿到兩個 linked list,需要合併後回傳
這一題可以使用遞迴或迭代的方法實作,我們接下來會依序介紹
class Solution:
def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
# 若 l1 為空,就沒必要比較,直接回傳 l2,反之亦然
if l1 == None:
return l2;
if l2 == None:
return l1;
# 判斷 input 的 l1 與 l2 第一個值誰比較大 (隨著每次呼叫自己,l1與l2會越來越短)
if l1.val < l2.val:
# l1 比較小,所以 l1 第一個值留下來,把 l1.next (第二個)值 跟 l2 再執行一次自身 function
l1.next = self.mergeTwoLists(l1.next, l2);
# 此時 return 的 l1 會是整串的,會包含 與 l2 相比,vl 這個比較小的值(第一個值),還有 self.mergeTwoLists(l1.next, l2) 後的結果
return l1;
else:
l2.next = self.mergeTwoLists(l1, l2.next);
return l2;
class Solution:
def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
# 產生一個 ListNode 型態的 linked list,並且 val 裡面塞 None (next 預設為 None)
merge = ListNode(None)
# 用一個 pointer 指向 linked list尾端,隨著不斷 merge,將永遠指向 merge linked list 尾端來新增 node
cursor = merge
# 若 l1 跟 l2 都不為空,則進行比較
while l1 and l2:
# 比較 l1 跟 l2 的第一個元素 val,比較小的則加入 cursor 中,並將 後面的 linked list 覆蓋上原 linked list (所以比較小的數字會消失)
if l1.val <= l2.val:
cursor.next = l1
l1 = l1.next
elif l1.val > l2.val:
cursor.next = l2
l2 = l2.next
cursor = cursor.next
# 若 l2 空了,則將剩下的 l1 全部接到尾端,反之亦然
if l1:
cursor.next = l1
else:
cursor.next = l2
return merge.next