1. 程式人生 > >鏈表問題(8)----合並

鏈表問題(8)----合並

locate left http 單鏈表 spa bubuko wid 指針 node

一、題目:合並兩個有序的單鏈表

技術分享圖片

思路:時間復雜度O(M+N),空間復雜度O(1)

簡單來說就是在原來的鏈表上采用三個指針來操作兩個鏈表。

技術分享圖片

技術分享圖片

代碼:

class Node:
    def __init__(self,value):
        self.val = value
        self.next = None
def mergeList(l1,l2):
    if not l1 or not l2:
        return l1 if l1 else l2
    cur1 , cur2 = l1 , l2
    head = cur1 if cur1.val < cur2.val else
cur2 cur = None while cur1 and cur2: tail = cur cur = cur1 if cur1.val < cur2.val else cur2 cur1 = cur1.next if cur == cur1 else cur1 cur2 = cur2.next if cur == cur2 else cur2 if tail: tail.next = cur tail.next.next = cur1 if cur1 else
cur2 return head head = Node(1) p = head for i in range(2,4): p.next = Node(i) p = p.next head1 = Node(1) p = head1 for i in range(2,5): p.next = Node(i) p = p.next mergeList(head,head1)

二、題目:按照左右半區的方式重新組合單鏈表

技術分享圖片

思路:時間復雜度O(N),空間復雜度O(1)

簡單來說就是將原鏈表拆分成左右半區,再合並。

技術分享圖片

代碼:

class
Node: def __init__(self,value): self.val = value self.next = None #拆分鏈表 def relocate(head): if not head or not head.next: return head slow = head fast = head.next while fast.next and fast.next.next: slow = slow.next fast = fast.next.next right = slow.next slow.next = None mergeLR(head,right) #合並鏈表 def mergeLR(left,right): if not left or not right: return left if left else right head = left cur =head while left: left = left.next cur.next = right cur = cur.next right = right.next cur.next = left cur = cur.next return head head = Node(1) p = head for i in range(2,9): p.next = Node(i) p = p.next res = relocate(head)

鏈表問題(8)----合並