leetcode141 環形鍊錶

2022-07-20 06:36:14 字數 994 閱讀 8013

判斷乙個單鏈表有無環:

問題解法:

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一步,兩者肯定會重疊。

**如下:

class

solution ;

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。知道了環起始位置,只要遍歷即可得到求環的長度。

**如下:

class

solution

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...