142. 环形链表 II
查看题目中等
链表
中频
解法一:双指针
时间复杂度: | 空间复杂度: | 推荐使用
动画演示
环形链表 II - 双指针算法
链表为空
是否有环:
否
环的入口:
无
操作日志
代码实现
class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null) {
return null;
}
// 初始化快慢指针
ListNode slow = head;
ListNode fast = head;
// 检查是否存在环
boolean hasCycle = false;
while (fast != null && fast.next != null) {
slow = slow.next; // 慢指针每次走一步
fast = fast.next.next; // 快指针每次走两步
if (slow == fast) {
hasCycle = true;
break;
}
}
// 如果没有环,返回null
if (!hasCycle) {
return null;
}
// 重置慢指针到链表头部
slow = head;
// 快慢指针同时前进,每次走一步,直到相遇
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
// 相遇点即为环的入口
return slow;
}
}时间复杂度:
空间复杂度: