星海

数据结构与算法 · 主观题 · 第 64 题

计算机基础面试八股 · 第 64 题

如何判断单链表是否有环?如果有环,如何找到环的入口?请说明原理。

参考答案

1. 判环:快慢指针都从头出发,慢指针每次走 1 步,快指针每次走 2 步。快指针走到 null 说明无环;两者相遇说明有环。时间 O(n),空间 O(1)。
2. 找入口:相遇后,让一个指针回到表头,另一个留在相遇点,两者都每次走 1 步,再次相遇的节点就是环入口。
3. 原理:设表头到入口距离为 a,入口到相遇点距离为 b,环长为 L。相遇时慢指针走了 a+b,快指针走了 a+b+kL,且快指针路程是慢指针的 2 倍,所以 a+b = kL,即 a = kL - b = (k-1)L + (L-b)。从相遇点再走 a 步正好到达入口,与从表头走 a 步的指针在入口相遇。
4. 环长:相遇后让一个指针继续走,再回到相遇点所走的步数就是环长。

解析

推导 a = (k-1)L + (L-b) 是关键得分点。

在线刷这套题:即时判分、错题本、闪卡复习,不用登录就能练。