力扣環形鍊錶

2021-09-10 07:16:53 字數 1604 閱讀 3397

給定乙個鍊錶,判斷鍊錶中是否有環。

為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置(索引從 0 開始)。 如果 pos 是 -1,則在該鍊錶中沒有環。

示例 1:

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

輸出:true

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

示例 2:

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

輸出:true

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

示例 3:

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

輸出:false

解釋:鍊錶中沒有環。

演算法通過使用具有 不同速度 的快、慢兩個指標遍歷鍊錶,空間複雜度可以被降低至 o(1)o(1)。慢指標每次移動一步,而快指標每次移動兩步。

如果列表中不存在環,最終快指標將會最先到達尾部,此時我們可以返回 false。

現在考慮乙個環形鍊錶,把慢指標和快指標想象成兩個在環形賽道上跑步的運動員(分別稱之為慢跑者與快跑者)。而快跑者最終一定會追上慢跑者。這是為什麼呢?考慮下面這種情況(記作情況 a) - 假如快跑者只落後慢跑者一步,在下一次迭代中,它們就會分別跑了一步或兩步並相遇。

1.定義快慢指標,如果只有乙個head節點直接返回false,不可能為環

2.然後這就是乙個追擊問題,最終跑得快的一定會再這個環中追到跑得慢的

class

solution

(object)

: def hascycle

(self, head)

:"""

:type head: listnode

:rtype: bool

"""slow=head

if head==none:

return false

fast=head.next

while slow!=fast:

if fast==none or fast.next==none:

return false

else

: slow=slow.next

fast=fast.next.next;

return true

我們可以通過檢查乙個結點此前是否被訪問過來判斷鍊錶是否為環形鍊錶。常用的方法是使用雜湊表。

class

solution

(object)

: def hascycle

(self, head)

:"""

:type head: listnode

:rtype: bool

"""cur=head

d=while cur:

if cur in d:

return true

else

: d[cur]=1

cur=cur.next

return false

```

鍊錶 環形鍊錶

環形鍊錶也叫迴圈鍊錶 可以是雙鏈表 也可以是單鏈表 操作原理和單鏈表差不多,只是最後乙個節點不在指向空 null 而是頭 head 這裡以單鏈表舉例 description 環形鍊錶 author lzq date 2018 11 3 20 46 version 1.0 public class a...

鍊錶 環形鍊錶

題目描述 給定乙個鍊錶,返回鍊錶開始入環的第乙個節點。如果鍊錶無環,則返回 null。為了表示給定鍊錶中的環,我們使用整數 pos 來表示鍊錶尾連線到鍊錶中的位置 索引從 0 開始 如果 pos 是 1,則在該鍊錶中沒有環。注意,pos 僅僅是用於標識環的情況,並不會作為引數傳遞到函式中。說明 不允...

環形鍊錶 鍊錶

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