LeetCode 热题100-51-环形链表Ⅱ

核心思想:快慢指针+数学推导
思路:
设链表中环外部分的长度为 a。slow 指针进入环后,又走了 b 的距离(与入环口差c的距离)与fast 相遇。此时,fast 指针已经走完了环的 n 圈,因此它走过的总距离为 a+n(b+c)+b=a+(n+1)b+nc。
根据题意,任意时刻,fast 指针走过的距离都为slow 指针的 2 倍。因此,我们有
a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
有了 a=c+(n-1)(b+c)的等量关系,我们会发现:从相遇点到入环点的距离c加上 n-1 圈的环长,恰好等于从链表头部到入环点的距离,相当于a的长度等于相遇点开始走n-1圈,再走c的距离。
因此,当发现slow 与fast 相遇时,我们再额外使用一个指针ln。起始,它指向链表头部;随后,ln和 slow 每次向后移动一个位置。最终,它们会在入环点相遇。
注意本题的快慢指针和上一题不太一样,为了方便推导公式。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {
        if(head == null){
            return null;
        }
        ListNode slow = head;
        ListNode quick = head;
        while(quick != null){
            if(quick != null && quick.next != null){
                slow = slow.next;
                quick = quick.next.next;
            }else{
                return null;
            }
            if(slow == quick){
                ListNode ln = head;
                while(ln != slow){
                    ln = ln.next;
                    slow = slow.next;
                }
                return ln;
            }
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值