题目描述:
一个链表中包含环,请找出该链表的环的入口结点。
思路:
对于判断一个链表是否有环,是通过双指针法,两个指针均指向链表头,一个每次挪一步,一个每次挪两步,如果最终两个指针能相遇,说明链表中有环。找到相遇的指针,然后绕着这个环一圈,就能得到环中的个数;根据环中的节点个数n,确定两个头指针,让一个先走n步,然后两个指针同时出发,当两个指针相遇的的时候就是环的入口。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode meeting(ListNode pHead){
if(pHead==null)
return null;
ListNode fast = pHead;
ListNode slow = pHead;
while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast==slow)
return fast;
}
return null;
}
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if (pHead==null)
return null;
ListNode meetingNode = meeting(pHead);
if (meetingNode==null)
return null;
int count = 1;
ListNode p = meetingNode.next;
while(p!=meetingNode){
p = p.next;
count+=1;
}
ListNode p1 = pHead;
ListNode p2 = pHead;
for(int i =0;i<count;i++)
p1 = p1.next;
while(p1!=p2){
p1 = p1.next;
p2 = p2.next;
}
return p1;
}
}