题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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; } }