题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解题思路
我们假设链表有环,那么设置一对快慢指针,快的一次走两格,慢的一次走一个格。
一旦慢的进入环,则后续则为快的追赶慢的,一次追赶一格。最后肯定会在环中某点相遇
图片说明
用A表示起点到入口点的距离
用B表示入口点到相遇点的距离
用C表示从相遇点到入口点的距离
则相遇时:快节点走过的路程为:A+n(B+C)+B---n>0
慢节点走过的路程为:A+B
又因为快节点速度是慢节点的2倍,则2A+2B=A+n
(B+C)+B
化简之后的:A=C+(n-1)*(B+C)
也就是说,此时再让两个节点以同样的速度从起点和相遇点出发,则一定会相遇在入口处
java代码如下

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

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

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode low=pHead;
        ListNode fast=pHead;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            low=low.next;
            if(low==fast)
                break;
        }
        if(fast==null || fast.next==null) return null;
        low=pHead;
        while(fast!=low){
            fast=fast.next;
            low=low.next;
        }
        return low;
    }
}