給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 null。
為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。
說明:不允許修改給定的鍊錶。
example:
輸入:head = [3,2,0,-4], pos = 1
輸出:tail connects to node index 1
解釋:鍊錶中有乙個環,其尾部連線到第二個節點。
**段:
class
solution
if(fast==
null
||fast-
>next==
null
)return
null
; fast=head;
while
(fast!=slow)
return fast;}}
;
作者是來自leetcode的jyd。。大佬太強了。。是類似於數學題的
以下是來自於大佬的解釋,侵刪。
解題思路:
這類鍊錶題目一般都是使用雙指標法解決的,例如尋找距離尾部第k個節點、尋找環入口、尋找公共尾部入口等。
演算法流程:
雙指標第一次相遇: 設兩指標 fast,slow 指向鍊錶頭部 head,fast 每輪走 222 步,slow 每輪走 111 步;
第一種結果: fast 指標走過鍊錶末端,說明鍊錶無環,直接返回 null;
tips: 若有環,兩指標一定會相遇。因為每走 111 輪,fast 與 slow 的間距 +1+1+1,fast 終會追上 slow;
第二種結果: 當fast == slow時, 兩指標在環中 第一次相遇 。下面分析此時fast 與 slow走過的 步數關係 :
設煉表共有 a+ba+ba+b 個節點,其中 鍊錶頭部到鍊錶入口 有 aaa 個節點(不計鍊錶入口節點), 鍊錶環 有 bbb 個節點(這裡需要注意,aaa 和 bbb 是未知數,例如**上鍊表 a=4a=4a=4 , b=5b=5b=5);設兩指標分別走了 fff,sss 步,則有:
fast 走的步數是slow步數的 222 倍,即 f=2sf = 2sf=2s;(解析: fast 每輪走 222 步)
fast 比 slow多走了 nnn 個環的長度,即 f=s+nbf = s + nbf=s+nb;( 解析: 雙指標都走過 aaa 步,然後在環內繞圈直到重合,重合時 fast 比 slow 多走 環的長度整數倍 );
以上兩式相減得:f=2nbf = 2nbf=2nb,s=nbs = nbs=nb,即fast和slow 指標分別走了 2n2n2n,nnn 個 環的周長 (注意: nnn 是未知數,不同鍊錶的情況不同)。
目前情況分析:
如果讓指標從鍊錶頭部一直向前走並統計步數k,那麼所有 走到鍊錶入口節點時的步數 是:k=a+nb(先走 aaa 步到入口節點,之後每繞 111 圈環( bbb 步)都會再次到入口節點)。
而目前,slow 指標走過的步數為 nbnbnb 步。因此,我們只要想辦法讓 slow 再走 aaa 步停下來,就可以到環的入口。
但是我們不知道 aaa 的值,該怎麼辦?依然是使用雙指標法。我們構建乙個指標,此指標需要有以下性質:此指標和slow 一起向前走 a 步後,兩者在入口節點重合。那麼從**走到入口節點需要 aaa 步?答案是鍊錶頭部head。
雙指標第二次相遇:
slow指標 位置不變 ,將fast指標重新 指向鍊錶頭部節點 ;slow和fast同時每輪向前走 111 步;
tips:此時 f=0f = 0f=0,s=nbs = nbs=nb ;
當 fast 指標走到f=af = af=a 步時,slow 指標走到步s=a+nbs = a+nbs=a+nb,此時 兩指標重合,並同時指向鍊錶環入口 。
返回slow指標指向的節點。
複雜度分析:
時間複雜度 o(n)o(n)o(n) :第二次相遇中,慢指標須走步數 a空間複雜度 o(1)o(1)o(1) :雙指標使用常數大小的額外空間。
leetcode 142 環形鍊錶
給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回null。說明 不允許修改給定的鍊錶。思路 首先通過快慢指標的方法判斷鍊錶是否有環 接下來如果有環,則尋找入環的第乙個節點。具體的方法為,首先假定鍊錶起點到入環的第乙個節點a的長度為a 未知 到快慢指標相遇的節點b的長度為 a b 這個...
Leetcode 142 環形鍊錶
問題重述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...
Leetcode142 環形鍊錶
目錄 一 題目 二 示例 三 思路 四 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。說明 不允許修改給定的鍊錶。高階 你能用 o ...