题目描述
一个链表中包含环,请找出该链表的环的入口结点。
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead)
{
// 如果head为空,或者为单节点,则不存在环
if (pHead == null || pHead.next == null) {
return null;
}
ListNode slow;
ListNode fast;
slow = fast = pHead;
// 先判断是否存在环
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
break;
}
}
if (fast != slow)
return null; // 不存在环
fast = pHead; // 快指针从头开始走,步长变为1
while (fast != slow) { // 两者相遇即为入口点
fast = fast.next;
slow = slow.next;
}
return fast;
}
}
分析:首先需要判断链表是否有环:设置两个指针slow、fast,slow和fast都指向pHead,fast每次走两步,slow每次走一步,如果slow和first重合了,就说明链表有环路了。
然后,让fast回到链表的头部,重新走,每次走一步,那么当slow和fast再次相遇的时候,就是环路的入口了。