剑指offer——链表中环的入口结点
问题描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
思路分析
- 判空
- 用快慢指针,一个快 (每次两步),一个慢(每次一步)
- 若相遇,则有环。不相遇则没有环。
- 相遇后,让慢指针回到头结点,快指针从相遇结点继续走。此时的步长都为1,相遇时的结点即为入口结点。
代码
/*
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;
}
return p1;
}
}
return null;
}
}