160. Intersection of Two Linked Lists
題目網址:https://leetcode.cn/problems/intersection-of-two-linked-lists/
題意:給兩個 linked list 的 head
headA
和headB
, 返回兩個 linked list 相交的起始點。若不存在相交, 則返回null
。題目保證 linked list 中不存在 cycle。
注意:函數返回後, linked list 必須保持原先的結構。
進階:設計 $O(m + n)$ time 且 $O(1)$ space 的演算法。
Solution 1:
想法:利用 hash set, 先將
headA
中的每個點 insert 到visited
中, 然後再遍歷headB
中的每個點, 一旦發現visited
已存在, 則返回該點。
class Solution { |
- time:$O(m + n)$ ➔ 遍歷兩個 linked list,
m
為headA
的長度,n
為headB
的長度 - space:$O(m)$ ➔
visited
儲存headA
中的所有 node
Solution 2:
想法:利用 Two Pointers, 先計算兩條 linked list 的長度, 先讓長度較長者走
abs(lenA - lenB)
步, 然後再和長度較短者同時前進, 這樣兩者就能在相交起點相遇。若兩者不存在相交, 則最後兩者會同時為null
相交
不相交
class Solution { |
- time:$O(m + n)$ ➔ 遍歷兩個 linked list,
m
為headA
的長度,n
為headB
的長度 - space:$O(1)$ ➔ 只需常數空間
Solution 3:
想法:Two Pointers, 令
headA
的長度為m
,headB
的長度為n
假設兩個 linked list 相交的部分有
c
個 node, 則headA
中不相交的部分有m - c
個 node,headB
中不相交的部分有n - c
個 node若要
l1
、l2
同時在相交的起始點node
相遇, 則要做以下操作 :
l1
遍歷完headA
後, 接著遍歷headB
, 當走到node
時 ➔l1
走了m + (n - c)
步
l2
遍歷完headB
後, 接著遍歷headA
, 當走到node
時 ➔l2
走了n + (m - c)
步此時
l1
、l2
在node
相遇, 因為m + (n - c) = n + (m - c)
若
c == 0
, 也就是兩個 linked list 不相交, 則l1
、l2
將同時變為null
class Solution { |
- time:$O(m + n)$ ➔ 遍歷兩個 linked list,
m
為headA
的長度,n
為headB
的長度 - space:$O(1)$ ➔ 只需常數空間