141 環形鍊錶

2022-07-25 02:51:09 字數 1395 閱讀 7859

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

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

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

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

示例 1:

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

輸出:true

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

/**

* definition for singly-linked list.

* struct listnode

* };

*/class solution

auto slow = head;

auto fast = head->next;

while(slow != fast)

slow = slow->next;

fast = fast->next->next;

}return true;}};

題解參照領扣官方解答

關鍵資訊:

1) 快慢指標一定在慢指標第一次入環後相遇

2) 相遇點到入環點的距離==頭結點到入環點的距離

step1:如圖所示,設煉表中環外部分的長度為 a, slow 指標進入環後,又走了 b 的距離與 fast 相遇。此時,fast 指標已經走完了環的 n 圈,因此它走過的總距離為a+n(b+c)+b=a+(n+1)b+nc

step2:任意時刻,fast 指標走過的距離都為 slow 指標的 2 倍。因此,我們有a+(n+1)b+nc=2(a+b)⟹a=c+(n-1)(b+c)

_

class solution 

//快慢指標一定在慢指標第一圈沒走完時相遇

listnode *slow = head, *fast = head;

while(fast)

fast = fast->next->next;

slow = slow->next;

if(slow == fast)

return ptr;}}

return nullptr;}};

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.首先想到...