最近在字节飞书项目的面试遇到这个问题没答上来,平时疏于练习算法,亡羊补牢一下。 单向链表是否存在环是计算机科学和编程中的一个常见问题。为了确定单向链表是否存在环,我们可以使用多种方法。下面,我将介绍两种常用的方法:快慢指针法和哈希表法。
1. 快慢指针法(Floyd's Cycle-Finding Algorithm)
这种方法的基本思想是使用两个指针,一个快指针和一个慢指针,它们从链表的头部开始移动。
- 慢指针:每次移动一步。
- 快指针:每次移动两步。
如果链表中不存在环,那么快指针最终会到达链表的尾部并变为null。但如果链表中存在环,快指针最终会追上慢指针,因为它的速度是慢指针的两倍。
2. 哈希表法
我们可以使用一个哈希表来存储已经访问过的节点。当我们遍历链表时,对于每个节点,我们都检查它是否已经在哈希表中。如果节点已经存在于哈希表中,那么链表中存在环。如果节点不在哈希表中,我们将其添加到哈希表中。如果我们遍历完整个链表都没有找到重复的节点,那么链表中不存在环。
比较
空间复杂度:
- 快慢指针法:O(1)。
- 哈希表法:O(n)。
时间复杂度:
- 快慢指针法和哈希表法都是:O(n)。
尽管两种方法在时间复杂度上相同,但在空间复杂度上,快慢指针法更有优势。然而,哈希表方法提供了更多的信息,例如环的起始节点。
结论
建议首先尝试使用快慢指针法,因为它不需要额外的空间。但如果需要确定环的起始位置或其他相关信息,哈希表法可能更为合适。