链表中等1 种解法
#142环形链表 II
若链表有环,返回环的入口节点;否则返回 null。
#链表#双指针
解题主线
01
设头到入口距离为 a、入口到首次相遇点距离为 b,可由快慢指针路程关系推出相遇点再走 a 步会到入口。
02
首次相遇后让一个指针回到 head,两个指针都改为每次一步,再次相遇处就是环入口。
解法 1:Floyd 定位环入口
先用快慢指针判断并找到环内相遇点,再用两个同速指针从 head 和相遇点定位入口。
时间复杂度
O(n)
空间复杂度
O(1)
java
public class Solution {
static final class ListNode {
int val;
ListNode next;
ListNode(int val) { this.val = val; }
}
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
do {
if (fast == null || fast.next == null) return null;
slow = slow.next;
fast = fast.next.next;
} while (slow != fast);
ListNode fromHead = head;
while (fromHead != slow) {
fromHead = fromHead.next;
slow = slow.next;
}
return fromHead;
}
}先用快慢指针判断并找到环内相遇点,再用两个同速指针从 head 和相遇点定位入口。
- 两个旧文件均为同一 Floyd 算法,因此只展示一次。
边界与易错点
- 第一阶段退出后必须先确认确实相遇,不能把无环时的 null 当作相遇点。
- 旧 Q142_detectCycle 的文档链接误指向第 54 题,与算法本身无关。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
Q142_detectCycle.javaQ142_linkedListCycleII.java