leetcode 21-合併兩個有序鏈表 python

將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。 

示例:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

鏈表是一種物理存儲單元上非連續、非順序的存儲結構數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱爲結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,操作複雜。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的複雜度,比另一種線性表順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間複雜度分別是O(logn)和O(1)。

1.用遞歸的方法

  • 在節點ListNode定義中,定義爲節點爲結構變量。
  • 節點存儲了兩個變量:value 和 next。value 是這個節點的值,next 是指向下一節點的指針,當 next 爲空指針時,這個節點是鏈表的最後一個節點。
  • 注意val只代表當前指針的值,比如p->val表示p指針的指向的值;而p->next表示鏈表下一個節點,也是一個指針。
  • 構造函數包含兩個參數 _value 和 _next ,分別用來給節點賦值和指定下一節點
​
​# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        if l1==None and l2==None:
            return None
        if l1==None:
            return l2
        if l2==None:
            return l1
        if l1.val<=l2.val:                         #對比兩個鏈表節點的值,如果l1小於l2
            l1.next=self.mergeTwoLists(l1.next,l2) #那麼則指向l1下一個節點,再與l2作比較                                                  
            return l1                              
        else:
            l2.next=self.mergeTwoLists(l1,l2.next) 
            return l2

​

​

​

2.不使用遞歸

​
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        head = ListNode(0)           #構建一個鏈表
        first = head                 #賦給first
        while l1!=None and l2!=None: #如果l1和l2下一個節點都不是None 進行判斷
            if l1.val <= l2.val:     #如果l1的節點值<=l2的節點值
                head.next = l1       #head的下一節點爲l1
                l1 = l1.next         #類似刪除這一節點
            else:
                head.next = l2
                l2 = l2.next
            head = head.next         #構建好的鏈表再賦給head
        if l1 != None:               #l1和l2都會最終指向None
            head.next = l1           #如果是l2的話,則next爲l1
        elif l2 != None:
            head.next = l2           #同理,next爲l2
        return first.next            #最後賦fiset

​

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章