141 環形鍊錶

2022-10-11 08:03:09 字數 1487 閱讀 7588

目錄給你乙個鍊錶的頭節點 head ,判斷鍊錶中是否有環。

如果鍊錶中有某個節點,可以通過連續跟蹤 next 指標再次到達,則鍊錶中存在環。 為了表示給定鍊錶中的環,評測系統內部使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。如果 pos 是 -1,則在該鍊錶中沒有環。注意:pos 不作為引數進行傳遞,僅僅是為了標識鍊錶的實際情況。

如果鍊錶中存在環,則返回 true 。 否則,返回 false 。

示例 1:

輸入:head = [3,2,0,-4], pos = 1

輸出:true

解釋:鍊錶中有乙個環,其尾部連線到第二個節點。

示例 2:

輸入:head = [1,2], pos = 0

輸出:true

解釋:鍊錶中有乙個環,其尾部連線到第乙個節點。

示例 3:

輸入:head = [1], pos = -1

輸出:false

解釋:鍊錶中沒有環。

鍊錶中節點的數目範圍是 [0, 104]

-105 <= node.val <= 105

pos 為 -1 或者鍊錶中的乙個 有效索引 。

高階:你能用 o(1)(即,常量)記憶體解決此問題嗎?

環有什麼特徵?

如果乙個環形的路,那麼就不會不停的重複走。假設用乙個指標去走鍊錶,那麼環形部分指標會再次走到。

那如何可以表達再次走到?

1.使用雜湊表,記錄訪問過的節點,如果這個節點在雜湊表中存在說明存在環

2.快慢指標:再找乙個指標,如果它們在環形區域相遇說明是有環的。乙個快指標一次走2個節點,乙個慢指標一次走1個節點,那麼如果在直線上他們永遠不會相遇。

總結快慢指標的特性 —— 每輪移動之後兩者的距離會加一

圖示當兩個指標都進入環後,每輪移動使得慢指標到快指標的距離增加一,同時快指標到慢指標的距離也減少一,只要一直移動下去,快指標總會追上慢指標。

說明如果有環一定會相遇

public class solution }}

如果存在環,如何判斷環的長度呢?方法是,快慢指標相遇後繼續移動,直到第二次相遇。兩次相遇間的移動次數即為環的長度。

假設t次移動之後相遇了,乙個slow走了t,那fast肯定走了2t,n表示圈數,y表示一圈的節點個數,說明t+ny=2t -> ny = (fast步長-slow步長)t t一定是個整數,y肯定是整數,n與(fast步長-slow步長)要成倍數關係,滿足條件的最小n=1

141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?乙個快指標走兩步 乙個慢指標走一步 如果相遇就有環 不然沒環 class solution def hascycle self,head type head listnode rtype bool index1 head inde...

141 環形鍊錶

鏈結 給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例1輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。示例2 輸...

141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。示例 1 輸入 head 3,2,0,4 pos 1 輸出 true 解釋 鍊錶中有乙個環,其尾部連線到第二個節點。1.首先想到...