判斷乙個單鏈表有無環:
問題解法:
1.set快取遍歷過的節點指標,到達單鏈表尾部無環,set元素重複則有環。
2.使用兩個指標遍歷slow+fast,slow每次走一步,fast每次走兩步。fast走到鍊錶尾部無環,slow與fast重疊則有環。
方法2思路:
若鍊錶的起始位置等於環的起始位置:slow走一圈回到起始位置,fast剛好走了兩圈。
環的起始位置在鍊錶的其他位置:待slow走到環的起始位置,fast在環的任意位置,可以看成是起點不同的遍歷,此時slow在走一圈範圍內肯定會被fast超越(起點相同情況下,slow走一圈,fast走兩圈;fast起點比slow靠後,fast能在slow走一圈前超越)。fast每次移動時靠近slow一步,兩者肯定會重疊。
**如下:
classsolution ;
return
false
; }
};
找出環的起始位置並求環的長度:
假設環的起點為a,環的長度為n,slow與fast重疊於環的位置b(單鏈表總長度: a+n),此時fast繞環走了k圈。
slow與fast重疊時,slow走了 (a+b) 步,fast走了(a+k*n+b)步,fast步數=slow步數*2。
即 2*(a+b) = (a+k*n+b); => k*n = a+b;
此時,再把slow移動到單鏈表起始位置(fast位於重疊位置b),slow與fast每次都只走一步。slow走到a位置時,fast走了(n-b) + k*n步,結合前面的公式,fast也會走到環的起始位置並與slow重疊,即環起始位置slow==fast。知道了環起始位置,只要遍歷即可得到求環的長度。
**如下:
classsolution
return
slow;}}
return
nullptr;
}};
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...