2019-05-28 leetcode 142. Linked List Cycle II 尋找?guī)Лh(huán)鏈表開始環(huán)的地方

屏幕快照 2019-05-28 下午10.43.57.png

解釋


6001559055056_.pic.jpg

當我們通過slow和fast碰撞得出他是有環(huán)的,這時候開始節(jié)點到loop的距離x1,等于他們相遇節(jié)點到loop開始的節(jié)點(距離為x3)
我們在開始節(jié)點和相遇節(jié)點,創(chuàng)建兩個節(jié)點,一次走一步,最終會相遇在loop開始的地方
fast跑的距離為:x1+x2+x3+x2+m(x3+x2) m代表跑了多少圈 你也去好奇為什么會額外有個(x2+x3),因為fast為了跟slow碰撞,他始終要循環(huán)一圈回來碰撞
slow跑的距離為:x1+x2+n(x2+x3) n代表跑了多少圈
fast = 2slow 則 x1+x2+x3+x2+m(x3+x2) = 2(x1+x2+n(x3+x2))
x2+x3 m(x3+x2) = x1+x2+2n(x3+x2)
x3 + ?(x3+x2) = x1 //這里我們不管他跑了多少圈,總之剩下x3和x1的距離到loop開始的點是一樣的,兩邊一起跑就會相遇在該點

public class Solution {
        public ListNode detectCycle(ListNode head) {
            ListNode slow = head;
            ListNode fast = head;
            Boolean isCircle = false;
            while (fast!=null&&fast.next!=null)
            {
                slow = slow.next;
                fast = fast.next.next;
                if (slow == fast)
                    isCircle = true;
            }
            if (isCircle == false)
            {
                return null;
            }
            ListNode start = head;
            while (slow != start)
            {
                slow = slow.next;
                start = start.next;
            }
            return start;
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容