將兩個有序鏈表合併爲一個新的有序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。
示例:
輸入: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