题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出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,slow=pHead;
//快慢指针法判断是否有环
do{
fast=fast.next.next;
slow=slow.next;
}while(fast!=slow);
//将快指针置为链表头,慢指针为相遇处,
//快慢指针同样速度前进,再次相遇时为环入口
fast=pHead;
while(fast!=slow){
fast=fast.next;
slow=slow.next;
}
return slow;
}
}
//更准确的写法
/*
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)return null;
ListNode fast=pHead,slow=pHead;
while(fast!=null && fast.next!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
ListNode slow2=pHead;
while(slow2!=slow){
slow2=slow2.next;
slow=slow.next;
}
return slow;
}
}
return null;
}
}