美文网首页
LeetCode 第142题:环形链表 II

LeetCode 第142题:环形链表 II

作者: 放开那个BUG | 来源:发表于2020-06-27 12:52 被阅读0次

    1、前言

    题目描述

    2、思路

    这个题目的思路是使用快慢指针,但是快慢指针相遇后,如果找到起点是一个问题。起点寻找的方式是:相遇后,将一个指针从头节点开始,一个指针从相遇的地方开始,他们相遇的地方是起点。

    解法描述

    证明如下:
    相遇时:

    slow走过的路程:x + y + n(y+z), n代表slow绕了n圈
    fast走过的路程:x + y + m(y+z),m代表fast饶了m圈
    m > n
    

    因为fast速度是slow两倍:

    2(x + y + n(y + z)) = x + y + m(y + z)
    x + y = (m - 2n)(y + z)
    x = (m - 2n)(y + z) - y
    y + z就是1圈,假设 o = m-2n,o是一个正整数,那么 x = o(y + z) -y
    如果o = 1,那么 x = z,和答主假设的情况一样
    如果o > 1,那么 x = (o-1)(y+z) + y + z - y, x = (o-1)(y+z) + z,即x的长度为o-1圈加上z
    

    所以,从第一阶段获得的相遇点,走过x距离机会到达环的起点。

    3、代码

    public class Solution {
        public ListNode detectCycle(ListNode head) {
            if(head == null){
                return null;
            }
    
            ListNode slow = head;
            ListNode fast = head;
    
            while(fast != null && fast.next != null){
                slow = slow.next;
                fast = fast.next.next;
                if(fast == slow){
                    fast = head;
                    while(fast != slow){
                        fast = fast.next;
                        slow = slow.next;
                    }
                    return fast;
                }
            }
    
            return null;
        }
    }
    

    相关文章

      网友评论

          本文标题:LeetCode 第142题:环形链表 II

          本文链接:https://www.haomeiwen.com/subject/zeraxktx.html