給定乙個鍊錶,判斷鍊錶中是否有環。
高階:
你能否不使用額外空間解決此題?
通過使用具有不同速度的快、慢兩個指標遍歷鍊錶,空間複雜度可以被降低至 o(1)o(1)o(1)。慢指標每次移動一步,而快指標每次移動兩步。
如果列表中不存在環,最終快指標將會最先到達尾部,此時我們可以返回 false。
現在考慮乙個環形鍊錶,把慢指標和快指標想象成兩個在環形賽道上跑步的運動員(分別稱之為慢跑者與快跑者)。而快跑者最終一定會追上慢跑者。這是為什麼呢?考慮下面這種情況(記作情況 a) - 假如快跑者只落後慢跑者一步,在下一次迭代中,它們就會分別跑了一步或兩步並相遇。
其他情況又會怎樣呢?例如,我們沒有考慮快跑者在慢跑者之後兩步或三步的情況。但其實不難想到,因為在下一次或者下下次迭代後,又會變成上面提到的情況 a。
1public
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...