给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:tail connects to node index 1
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:
输入:head = [1,2], pos = 0
输出:tail connects to node index 0
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:
输入:head = [1], pos = -1
输出:no cycle
解释:链表中没有环。

进阶:
你是否可以不用额外空间解决此题?
双指针法
//第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
//第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x; n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。
public ListNode detectCycle(ListNode head) {
ListNode slow = head, fast = head;
while (fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
if (slow == fast){
fast = head;
int idx = 0;
while (slow!=fast){
idx++;
slow = slow.next;
fast = fast.next;
}
if (slow==fast){
System.out.println("tail connects to node index " + idx);
return slow;
}
}
}
System.out.println("no cycle");
return null;
}
本文介绍了一种高效查找链表中环入口的方法,通过双指针技巧,无需额外空间即可找出链表开始入环的第一个节点。示例展示了如何在不同情况下定位环的入口,包括环尾连接到链表中的任意节点或链表无环的情况。

被折叠的 条评论
为什么被折叠?



