剑指Offer_55_链表中环的入口结点
题目描述
一个链表中包含环,请找出该链表的环的入口结点。
解题思路
先用两个指针,一个一次走两步,一个一次走一步,直到两个节点相遇(有环的话)
然后再定义一个指针重新重头开始走,每次走一步,知道与之前的一步的指针相遇就是环的开始节点
实现
/*链表结点定义*/
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.next;
while (p1 != p2 && p2.next != null){
p1 = p1.next;
p2 = p2.next.next;
if (p2 == null) //不是环
break;
}
if (p1 == p2){
//有环
ListNode p = pHead;
p1 = p1.next;
while (p != p1){
p = p.next;
p1 = p1.next;
}
return p;
}
return null;
}
}