leetcode 142環形鍊錶

2021-10-02 23:12:29 字數 2075 閱讀 8175

給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。 如果鍊錶無環,則返回 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 ...