(1)設定快慢指標,快指標一次走2步,慢指標一次走1步;如果快指標遍歷到空指標,則鍊錶沒有環;否則快指標將追上慢指標,兩個指標在環內相遇
(2)快指標從頭以相同步長同慢指標開始遍歷,兩個指標將在環的入口處相遇(有對應數學證明)
簡單的證明如下:
設slow在第一階段走的路程為k
,則fast走的路程為2k
,同時設從起點到入口節點的長度為l
,環的長度為c
。
則slow走到環內的位置x = k - l
,slow相對入口節點的距離為x
。又因為fast和slow在圈內相遇,fast在圈內的位置=slow在圈內位置(fast多走了一圈環),則有2k-l = x + k
。
證明第二階段fast和slow會在入口處相遇
第二階段,slow最終在環內的位置為x+l = x + (k-x) = k
,k%k = 0
,即此時到達的是環的入口節點!!這就證明了第二階段fast和slow相遇的點為環的入口節點
複雜度分析
時間複雜度:o(n)
空間複雜度:o(1)
/**
* definition for singly-linked list.
* struct listnode
* };
*/class
solution
while
(fast!=
nullptr
&& fast!=slow)
;// fast和slow在環內相遇; 則表示有環存在
if(fast ==
nullptr
&& slow!=
nullptr
)return
nullptr
;// fast為空沒有環
// fast從頭以相同步長遍歷,相遇節點為第乙個節點
leetcode 142 環形鍊錶
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...
leetcode 142環形鍊錶
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。example 輸入 head 3,2,0,4 pos 1...
Leetcode 142 環形鍊錶
問題重述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...