解题思路
如何判断是否有环
如何找出环的入口?将有环的链表,分为三部分
- 链表首节点到入口,长度为
a
- 入口到判断是否有环时快慢指针相遇的节点,长度为
b
- 快慢指针相遇的节点到入口,长度为
c
分析快慢指针所走长度已经关系
- 快指针所走长度:
a + n(b + c) + b
- 慢指针所走长度:
a + b
- 快指针所有长度为慢指针的两倍
a + n(b + c) + b = 2(a + b)
可得a = (n - 1)(b + c) + c
,而b + c
是环的长度
所以当快慢指针相遇时,用一个指针指向链表首节点,然后与慢指针同时逐步迭代一个节点,两者相遇之处为环的入口
代码
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
ListNode slow = head, quick = head;
while (quick != null) {
slow = slow.next;
if (quick.next != null) {
quick = quick.next.next;
} else {
return null;
}
if (slow == quick) {
ListNode result = head;
while (result != slow) {
result = result.next;
slow = slow.next;
}
return result;
}
}
return null;
}
}