题目
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路
- 若链表中环有n个节点,那么从头结点开始一指针先移动n步,另一指针再开始移动,则二者将相遇于环的入口节点。
- 可令一快指针一次走两步,一慢指针一次走一步,二者迟早相遇于环中。此时从该相遇节点出发绕环一周所走步数即为环中的节点数。
代码
public class Solution {
public ListNode MeetingPoint(ListNode head){
ListNode slow = head;
ListNode fast = slow.next;
while(slow!=null&&fast!=null){
if(slow==fast)
return slow;
slow=slow.next;
fast=fast.next;
if(fast!=null&&fast!=slow)
fast=fast.next;
}
return null;
}
public ListNode EntryNodeOfLoop(ListNode pHead)
{
if(pHead==null)
return null;
ListNode mNode = MeetingPoint(pHead);
if(mNode==null)
return null;
ListNode p = mNode.next;
int loopNum=1;
while(p!=mNode){
++loopNum;
p=p.next;
}
ListNode p1 = pHead;
ListNode p2 = pHead;
for(int i=0;i<loopNum;i++)
p1=p1.next;
while(p1!=p2){
p1=p1.next;
p2=p2.next;
}
return p1;
}
}