第一种:快慢指针法,如果有环,则两个指针一定相遇。此时,慢指针回到头结点,快指针在相遇点不变,两者同时往前走。再次相遇的时候就是环入口。下图中N为环的长度。
/*
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 p1=pHead;
ListNode p2=pHead;
while(p2!=null&&p2.next!=null)
{
p1=p1.next;
p2=p2.next.next;
if(p1==p2)
{
p1=pHead;
while(p1!=p2)
{
p1=p1.next;
p2=p2.next;
}
if(p1==p2)return p1;
}
}
return null;
}
}
断链法:这个就走一步断一个节点,如果有环,那么最后一个节点就是环入口
/*
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.next;
ListNode slow=pHead;
while(fast!=null){
slow.next=null;
slow=fast;
fast=fast.next;
}
return slow;
}
}