题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
(1)快的指针一下走两个节点,慢的指针一下有一个节点,当两个指针相遇时,说明肯定有环
(2)相遇时,快的一共走过的节点是2x,慢的一共走过的节点是x;而两个指针都是从起点开始出发,到环入口点走过的节点是一样的,所以2x-x就是环节点的整数倍,刚好就x,刚好就是慢的节点所走的节点数目,也就是慢的节点从头结点到现在相遇的节点就是环节点的个数。那么让快节点从头结点出发,每次走一步,慢节点继续走,两个节点必会相遇在环入口点。
因为慢节点走的路程就换节点的整数倍,所以现在相遇的节点逆时针到头结点就是环的节点数
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead){
if(pHead==null || pHead.next==null){
return null;
}
ListNode fast=pHead;
ListNode slow=pHead;
while(fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
fast=pHead;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return fast;
}
}
return null;
}
}