偶然發現很多文章和牛客、leetcode上的說明都是錯的, 大部分的公式貌似都以為fast結點多走一圈就和slow相遇, 貌似沒有考慮到fast可能會多跑了n圈的結果.
fast結點每次走兩步, slow結點每次走一步
公式如下:
假設煉表頭結點到環的頭結點長度為a
環的頭結點到第一次相遇的結點距離為b,
環的長度為 r
那麼 slow走過的距離為 a + b, fast走過的距離為a + nr + b
所以 d(fast) = 2d(slow) => 2a + 2b = a + b + nr => a + b = nr => a = nr - b;
所以在第一次相遇的時候slow結點已經在圈內走過了 b這麼長的距離, 這個時候我們再讓煉表頭結點的指標 和 slow結點的指標一起走a這麼長的距離後, 頭結點的指標就走到了環的頭結點位置, slow結點 走過a距離也就相當於走了nr - b的距離。 加上他本身在環內已經走了b的距離, 所以就會回到環的頭結點! (也就是2a + b = nr + a)
鍊錶是否存在環
鍊錶環的問題有兩種,一種是判斷是否存在環,另一種是在有的基礎上返回入環的第乙個節點。簡單思路 1 遍歷鍊錶,如果遇到空,那麼肯定無環。2 在遍歷的過程中,每個節點都加入到雜湊表中,加入前判斷是否存在,如果存在的話那麼就有環,而且第乙個判斷存在的節點就是入環的第乙個節點。總結 這個比較簡單,既可以做到...
鍊錶的入環結點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。以下為分析過程為 左程雲 程式設計師 面試指南 it名企演算法與資料結構題目最優解 中的解析 如果乙個鍊錶沒有環,那麼遍歷鍊錶一定可以遇到鍊錶的終點 如果鍊錶中有環,那麼遍歷鍊錶就永遠在環裡轉下去了。如何找到第乙個入環結點,具...
鍊錶環的入口結點
如果乙個鍊錶包含環,如何找出環的入口結點?單鏈表只有乙個指標域,所以環的話一定是後半部分成環或者是一整個。關於這種鍊錶問題,一般都是可以用雙指標來解決。首先考慮特殊情況,不是環 雙指標 鍊錶為none。1.通過pre和latter兩個指標,同時走,pre的速度是latter的兩倍,如果pre小於等於...