题目描述
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
解法分析
1、设置两个快慢指针,慢指针步长为1,快指针2;
2、快慢指针同时从起点出发,在环内相遇,记录相遇点;
3、任取一指针回到起点,例如慢指针重新回到起点,快指针停在相遇点,然后一起以步长为1的速度前进,最终相遇点就是环入口。
算法解释中的各个点如图所示。
代码实现
class Solution {
public ListNode EntryNodeOfLoop(ListNode pHead) {
//判空
if (pHead == null) return null;
//快慢指针
ListNode low = pHead;
ListNode fast = pHead;
while (low != null && fast != null){
fast = fast.next.next;
low = low.next;
//到达相遇点,结束这段循环
if (fast == low)
break;
}
if (fast == null || fast.next == null) return null;
//指定任一指针从起点出发
low = pHead;
while (fast != low){
fast = fast.next;
low = low.next;
}
return low;
}
}