# **Leetcode筆記(Merge Two Sorted Lists)** :::info :information_source: 題目 : Merge Two Sorted Lists, 類型 : linked list , 等級 : easy 日期 : 2023/02/26,2023/05/30,2023/07/01,2023/10/02,2023/12/03,2025/04/02 ::: ### 嘗試 ```python # 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]: newlist = [] while list1 != None and list2 != None: if list1.val >= list2.val: list1.append() list2.append() else: list1.append() list2.append() list1 = list1.next list2 = list2.next if list1 == None: return list2 if list2 == None: return list1 ``` 2023/05/30 ```python # 要回傳一串list的時候,是要寫一個listnode的next head.next # 自己也要移下一個 list1 = list1.next tail = tail.next class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: head = ListNode() tail = head if not list1 and not list2: return None while list1 and list2: if list1.val <= list2.val: tail.next = list1 list1 = list1.next else: tail.next = list2 list2 = list2.next tail = tail.next if not list1 and list2: tail.next = list2 if list1 and not list2: tail.next = list1 return head.next # 回傳的是head.next 不是head ``` 2023/07/01 ```python # 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]: dummy = tail = ListNode() if not list1 and not list2: return None while list1 and list2: if list1.val <= list2.val: tail.next = list1 list1 = list1.next else: tail.next = list2 list2 = list2.next tail = tail.next if list1: tail.next = list1 if list2: tail.next = list2 return dummy.next ``` 2023/10/02 ```python class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: head = ListNode() dummy = head while list1 and list2: if list1.val <= list2.val: dummy.next = list1 list1 = list1.next else: dummy.next = list2 list2 = list2.next dummy = dummy.next if list1: dummy.next = list1 if list2: dummy.next = list2 return head.next ``` 2023/12/03 ```python class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: dummy = tail = ListNode() while list1 and list2: if list1.val >= list2.val: tail.next = list2 list2 = list2.next else: tail.next = list1 list1 = list1.next tail = tail.next if list1: tail.next = list1 if list2: tail.next = list2 return dummy.next ``` 2025/04/02 ```python class Solution: def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]: dummy = tail = ListNode() while list1 and list2: if list1.val < list2.val: tail.next = list1 list1 = list1.next else: tail.next = list2 list2 = list2.next tail = tail.next if list1: tail.next = list1 list1 = list1.next if list2: tail.next = list2 list2 = list2.next return dummy.next ``` --- ### **優化** 時間複雜度O(n),空間複雜度O(1) ```python # 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]: dummy = ListNode() # 建立一個空的node tail = dummy # dummy不會動 會一直在new list的前面 while list1 != None and list2 != None: if list1.val <= list2.val: tail.next = list1 list1 = list1.next else: tail.next = list2 list2 = list2.next tail = tail.next # 若長度不一致 if list1 != None: # list1比較長 tail.next = list1 if list2 != None: tail.next = list2 return dummy.next # 是在dummy下一個的指標才會開始接真正的list ``` --- **:warning: 錯誤語法** :::warning linked list不能.append() tail也要記得換位置tail.next 要考慮兩個list不同長度的情況 ::: **:thumbsup:學習** :::success 建立dummy node= ListNode(),dummy其實類似head,它的next就是 ::: **思路** **講解連結** https://www.youtube.com/watch?v=XIdigk956u0 Provided by. NeetCode ###### tags: `linked list` `easy` `leetcode`