標籤:雜湊表 leetcode 倒數 style 指標 迴圈 接下來 tno ==
這道題 要想解決其實不難, 開兩層迴圈進行遍曆就能實現,但是會逾時
如果想要O(n) 的時間複雜度, 我考慮用雜湊表來儲存遍曆過的元素,如果發現當前遍曆的元素在雜湊表裡,那說明交叉點就在這
這裡利用了雜湊表的尋找時間是O(1)
但是這種演算法不能滿足空間複雜度是O(1)的要求
代碼像這樣:
1 class Solution(object): 2 def getIntersectionNode(self, headA, headB): 3 """ 4 :type head1, head1: ListNode 5 :rtype: ListNode 6 """ 7 # 如果有一個鏈表是空的 那就沒有交叉 8 if headA is None or headB is None: 9 return None10 # 計算一下兩個鏈表的長度11 ca = headA12 cb = headB13 ta, tb = 1, 114 while ca.next is not None:15 ta += 116 ca = ca.next17 while cb.next is not None:18 tb += 119 cb = cb.next20 # 如果最後一個元素都不一樣說明沒有交叉21 if ca.val != cb.val:22 return None23 # 如果兩個鏈表長度不一樣,將長得鏈表指標後移24 ca = headA25 cb = headB26 while tb > ta:27 tb -= 128 cb = cb.next29 while ta > tb:30 ta -= 131 ca = ca.next32 # 從倒數長度相同的 短的鏈表的開頭開始一位一位比較33 while ca is not None and cb is not None:34 if ca.val == cb.val:35 return ca36 ca = ca.next37 cb = cb.next
經過一段時間思考,如果要滿足空間複雜度是O(1) 那就不能開闢新空間,智能用指標來回移動的辦法
1 如果任何一個鏈表是空的說明沒有交叉
2 如果鏈表交叉了最後一個元素肯定相同, 如果不相同說明沒交叉
3 如果確定了有交叉,計算一下兩個鏈表的長度,
思想是 調整到一樣長,然後位元壓縮 這樣一次遍曆就可以
具體這樣做: 每個鏈表都有一個遍曆指標,
短的鏈表的指標在頭部
長的鏈表指標後移若干位,一直到 兩個鏈表從尾巴開始數 到遍曆指標的長度是相同的
接下來就一遍遍曆 每一位都比較一下是否相等就可以
這樣沒有開闢新的空間 時間上是一遍遍曆O(n)
1 class Solution(object): 2 def getIntersectionNode(self, headA, headB): 3 """ 4 :type head1, head1: ListNode 5 :rtype: ListNode 6 """ 7 # 建立一個雜湊表,把每個第一次遍曆到的元素存進去 8 # 如果發現之前存過當前元素說明交叉了 9 dic = {}10 ca = headA11 cb = headB12 while ca is not None or cb is not None:13 if ca is not None:14 try:15 dic[ca.val]16 return ca17 except:18 dic[ca.val] = True19 ca = ca.next20 if cb is not None:21 try:22 dic[cb.val]23 return cb24 except:25 dic[cb.val] = True26 cb = cb.next27 return None
leetcode 相交鏈表 python實現