1. 程式人生 > 其它 >第51期-基礎結構-連結串列-合併兩個有序連結串列

第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.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:
#在此填寫程式碼 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

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值