题目描述
一个链表中包含环,请找出该链表的环的入口结点。
/*
如果链表中环 有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。
当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。
所以首先要得到环中结点的数目。
*/
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
//如果环存在,则一个每次走2步,一个每此走一步,最终相遇的地方一定在环内。
public ListNode MeetNode(ListNode node){
if(node==null){
return null;
}
ListNode one = node.next;
if(one == null) {
return null;
}
ListNode two = one.next;
if(two==null){
return null;
}
while(one!=null && two!=null){
if(one==two){
return two;
}
one = one.next;
two = two.next;
if(two.next==null){
return null;
}else{
two = two.next;
}
}
return null;
}
public ListNode EntryNodeOfLoop(ListNode pHead)
{
//需要找到环的节点个数
ListNode p1 = MeetNode(pHead);
if(p1==null){
return null;
}
//找一个节点一直跑,知道重复到这个节点,那么环的个数就知道了
ListNode p2 = p1;
int count =1;
while(p2.next!=p1){
p2=p2.next;
count++;
}
//找到环的个数后,一个节点先走count,一个后走count,相遇的位置即是环口
ListNode first = pHead;
for(int i=0;i<count;i++){
first = first.next;
}
ListNode second = pHead;
while(first !=second){
first = first.next;
second = second.next;
}
return first;
}
}