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)$ ➔ 只需常數空間



