链表中环的入口结点

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。

解法

快慢指针法
若假设有环存在,则快慢指针会交汇
若此时初始化一个指针从头结点出发,则这个指针与慢指针交汇的结点为环入口结点
此结论可通过画图证明:
假设进入环前的路程为r1,交汇点与入口的距离为r2,余下距离为r3.
则慢指针路程为r1 + r2
快指针路程为r1 + k(r2 + r3) + r2
然而慢指针速度是快指针的1/2
因此化简因式 2(r1 + r2) = r1 + k(r2 + r3) + r2
r1 = (k - 1)r2 + k*r3 (k<=1) 且 r2 + r3为环总长度
所以r1 = r3
详细代码如下:

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode n1 = pHead;//slow
        ListNode n2 = pHead;//fast
        ListNode n3 = pHead;//result
        if(n1 == null||n1.next == null){
            return null;
        }
        while(n1 != null){
            n1 = n1.next;
            n2 = n2.next.next;
            if(n2 == n1){
                while(n1 != n3){
                    n1 = n1.next;
                    n3 = n3.next;
                }
                return n3;
            }
        }
        return null;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值