给定一个链表,求入环的第一个节点

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL,最后有力扣题的链接

根据上面的动图我们可以推出下列结论:

前提:fast和slow相遇了

 1.fast走的路程是多少:

答:X+C+(C-Y)

2.slow走的路程是多少:

答:X+C-Y

3.fast走的路程是slow的两倍:

因为fast一次走两步,slow一次走一步,下面是一个数学问题,把分别对应的路程带入然后化简即可

2*(X+C-Y) = X + C + C -Y

X + X + C + C - Y - Y = X + C + C - Y

X - Y = 0 

X = Y

通过这个结论我们可以得出,起始点的距离到入口点的距离 和 相遇点的距离到入口点的距离是相等的,所以我们以相同的速度,一个从起始点出发一个从相遇点出发,再次相遇,就是入口点!!

但是这里又出现了新的问题,如果环很小我们应该怎么办呢?

这种情况下,slow已经走完很多圈了,但是fast还没有走到入口点的位置,我们又该如何应对,请看下面的解释

1.fast走的路程是多少:

答:X+NC+(C-Y)   //N代表的是圈数

2.slow走的路程是多少:

答:X+C-Y

3.fast走的路程是slow的两倍:

2*(X + C - Y) = X + NC + C - Y

X + X + C + C - Y - Y = X + NC + C - Y

X + C - Y = NC

X = NC - C + Y

X = (N-1)C + Y

如果N为1,那么X = Y

最后我们附上力扣的题的链接:. - 力扣(LeetCode)

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

首先得判断是否成环,如果是环那么在找入口点,如果不是环,那么返回null

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值