設計鏈表
一、LeetCode題解
瞧一瞧~
- 博健的LeetCode題解:Gitbook版本傳送門
- 博健的LeetCode題解:CSDN傳送門
- 前端進階筆記:Gitbook傳送門
二、算法題
題目
給定一個鏈表,返回鏈表開始入環的第一個節點。 如果鏈表無環,則返回 null。如果有環,則確定它的入口位置。
注意:
如果兩個鏈表沒有交點,返回 null.
在返回結果後,兩個鏈表仍須保持原有的結構。
可假定整個鏈表結構中沒有循環。
程序儘量滿足 O(n) 時間複雜度,且僅用 O(1) 內存。
解法一(雙指針)
思路
- 定義A、B節點對應headA、headB鏈表
- 如果兩個鏈表相交,那麼他們的共同點就是相交節點及以後的節點相等;
- 在未知長度的鏈表中,爲了保證兩個節點走相同的路程。
- A節點走完後,走B節點,假設A鏈表交點前的節點數尾a
- B節點走完後,走A節點,假設A鏈表交點前的節點數尾b
- 如果存在交點:A和B在相遇前都走了
a+共同節點+b
,此時A === B
代碼
var getIntersectionNode = function(headA, headB) {
var A = headA
var B = headB
while(A || B){
if(A === B) return A
A = A ? A.next : headB
B = B ? B.next : headA
}
return null
};