Leetcode 141 環形鍊錶

2021-09-24 14:48:02 字數 902 閱讀 3672

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

高階:

你能否不使用額外空間解決此題?

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

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

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

其他情況又會怎樣呢?例如,我們沒有考慮快跑者在慢跑者之後兩步或三步的情況。但其實不難想到,因為在下一次或者下下次迭代後,又會變成上面提到的情況 a。

1

public

boolean

hascycle(listnode head)

5 listnode slow=head;

6 listnode fast=head.next;

7while(slow!=fast)

11 slow=slow.next;

12 fast=fast.next.next;13}

14return

true

;15 }

複雜度分析

因此,在最糟糕的情形下,時間複雜度為 o(n+k)o(n+k)o(n+k),也就是 o(n)o(n)o(n)。

空間複雜度:o(1)o(1)o(1), 我們只使用了慢指標和快指標兩個結點,所以空間複雜度為 o(1)o(1)o(1)。

leetcode141 環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?思路 剛開始想著讓他迴圈下去,直到和頭結點相同的時候,就返回 true,否則就返回 false,但還是 too young too 實際上還是設定兩個指標,乙個快指標和乙個慢指標,只要是在環裡面,總會相遇的,就可 return t...

LeetCode141 環形鍊錶

題目描述 給定乙個鍊錶,判斷鍊錶中是否有環。高階 你能否不使用額外空間解決此題?演算法描述 1.使用兩個快慢指標遍歷鍊錶。slow每次走一步,fast每次走兩步。fast走到鍊錶尾部無環,slow與fast重疊則有環。2.若鍊錶的起始位置等於環的起始位置 slow走一圈回到起始位置,fast剛好走了...

LeetCode141環形鍊錶

給定乙個鍊錶,判斷鍊錶中是否有環。設定兩個指標,乙個fast乙個slow,遍歷整個列表,若達到表尾時仍未出現指標相等則鍊錶無環。c語言版 definition for singly linked list.struct listnode bool hascycle struct listnode h...