第51期-基礎結構-連結串列-合併兩個有序連結串列
1 問題描述
將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。
示例 1:
輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
示例 2:
輸入:l1 = [], l2 = []
輸出:[]
示例 3:
輸入:l1 = [], l2 = [0]
輸出:[0]
初始程式碼
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.nextView Code= None class LinkList: def __init__(self): self.head=None def initList(self, data): while len(data)==0:return None self.head = ListNode(data[0]) r=self.head p = self.head for i in data[1:]: node = ListNode(i) p.next = node p= p.next return r def printlist(self,head): a=[] if head == None: return [] node = head while node != None: a.append(node.val) node = node.next return a class Solution: def mergeTwoLists(self,l1: ListNode, l2: ListNode) -> ListNode:#在此填寫程式碼 if __name__ == '__main__': print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([1,2,4]),LinkList().initList([1,3,4])))) print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([])))) print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([0]))))
2 解題思路
- 標籤:連結串列
- 儲存頭指標,移動當前指標,比較大小,最後將還沒遍歷完的直接接上
#3 解題方法
# Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class LinkList: def __init__(self): self.head=None def initList(self, data): while len(data)==0:return None self.head = ListNode(data[0]) r=self.head p = self.head for i in data[1:]: node = ListNode(i) p.next = node p = p.next return r def printlist(self,head): a=[] if head == None: return [] node = head while node != None: a.append(node.val) node = node.next return a class Solution: def mergeTwoLists(self,l1: ListNode, l2: ListNode) -> ListNode: p=ListNode(0) q=p while l1 and l2: if l1.val>=l2.val: p.next=l2 l2=l2.next else: p.next=l1 l1=l1.next p=p.next p.next = l1 if l1 is not None else l2 return q.next if __name__ == '__main__': print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([1,2,4]),LinkList().initList([1,3,4])))) print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([])))) print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([0]))))View Code
第1-30,44-47行:題目中已經給出的資訊,執行程式碼時要根據這些程式碼進行編輯(具體為建立連結串列以及列表、連結串列轉換)
第31行:建立初始連結串列p,頭指標數值為0
第32行:儲存頭指標於變數q上,移動的是p指標
第33行:當l1和l2都不為None時,迴圈(print(None)的結果為False)
第34行:判斷l1當前節點的數值是否大於l2當前節點的數值
第35行:若l1當前節點的數值大於l2當前節點的數值,則將p連結串列指向l2
第36行:l2節點指向其下一個節點
第37-38行:l1當前節點的數值小於l2當前節點的數值,則將p連結串列指向l1
第39行:l1節點指向其下一個節點
第40行:p節點指向他的下一個節點,用於為下一個節點賦值
第41行:若l1或l2有一者為None時,代表一個連結串列已經遍歷到結尾了,但是另一個連結串列還有數值,此時將p節點指向非空的連結串列
第42行:返回q.next(q.next指向新連結串列的頭指標)
程式碼執行結果為:
#結構講解
這裡用到了基礎結構:連結串列,簡單講解下這個連結串列:
連結串列
連結串列是一組資料項的集合,其中每個資料項都是一個節點的一部分,每個節點還包含指向下一個節點的連結
連結串列的結構:data為自定義的資料,next為下一個節點的地址。
基本元素
節點:每個節點有兩個部分,左邊稱為值域,存放使用者資料;右邊部分稱為指標域,用來存放指向下一個元素的指標。
head:head節點永遠指向第一個節點
tail: tail永遠指向最後一個節點
None:連結串列中最後一個節點的指標域為None值