1. 环形链表 II 问题解析
今天我们来深入探讨LeetCode热题142——环形链表II。这道题在面试中出现的频率相当高,因为它不仅考察对链表结构的理解,还考验算法思维和数学推导能力。题目要求我们找到一个链表中环的起始节点,如果链表无环则返回null。
1.1 问题本质与核心挑战
想象你在一座环形跑道上跑步,跑道有一段直线入口。现在的问题是:如何确定这条直线入口的起点在哪?这就是环形链表问题的现实类比。
这道题的核心挑战在于:
- 判断链表是否有环(环形链表I已经解决过这个问题)
- 在确认有环的情况下,找到环的入口节点
- 不能修改原始链表结构(这意味着不能使用标记法)
提示:在实际工程中,类似的问题可能出现在检测循环依赖、死锁检测等场景,因此这个算法有很强的实用价值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 哈希集合法:直观但耗内存的解法
2.1 基本思路与实现
哈希集合法的思路非常直接:我们遍历链表,把每个访问过的节点存入HashSet。当遇到第一个已经存在于集合中的节点时,那就是环的入口节点。
java复制public class Solution {
public ListNode detectCycle(ListNode head) {
Set<ListNode> visited = new HashSet<>();
ListNode curr = head;
while (curr != null) {
if (visited.contains(curr)) {
return curr; // 找到入环点
}
visited.add(curr);
curr = curr.next;
}
return null; // 无环
}
}
2.2 时间复杂度分析
- 时间复杂度:O(n)
- 最坏情况下需要遍历整个链表
- 空间复杂度:O(n)
- 需要存储所有节点的引用
2.3 优缺点评估
优点:
- 实现简单直观
- 容易理解和验证
- 适用于快速验证思路
缺点:
