已知链表中含有环,返回这个环的起始位置

86 阅读1分钟

www.cnblogs.com/kyoner/p/11… 文章是在这里看的,是在下愚昧,好不容易才想明白,说下我的思路 代码就用他的了

    ListNode fast, slow;
    fast = slow = head;
    while (fast != null && fast.next != null) {
        fast = fast.next.next;
        slow = slow.next;
        if (fast == slow)
            break;
    }
    
    slow = head;
    while (slow != fast) {
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
}

image.png

开始我比较难理解的就是 假设slow走了K步 fast走了2k步,头结点到环的起点的距离为n,环的起点到相遇点的距离为m,两指针相遇,得出结论环的长度为k,我就在想环小点,slow不是就走了不止一圈, 下一秒就被自己蠢到了,如果走了不止一圈,那岂不是早都相遇了,所以n+m<k不成立,即n+m>k,肯定是slow环的一圈还没走完,然后能相遇只能是fast走完一圈环追上slow,所以这样环的长度就为k,这时两个指针顺时针(逆时针也一样)距离环的起点就有k-m,这时让两指针的速度统一为slow的速度,把一个放在刚才相遇的点,另一个放在头结点,那么他们下一次相遇的地方就是环的起点,用纸画一下应该更清楚。