链表中环的检测
leetcode 第131题
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
进阶:
你能用 O(1)(即,常量)内存解决此问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用Set集合存储
很容易想到,我们可以在遍历链表的时候,将遍历过的节点放入Set中.当遍历到一个节点,当前节点Set中以存在时,则表示链表有环.
代码如下:
1 | Set<ListNode> set = new HashSet<>(); |
复杂度分析
时间复杂度:O(n),对于含有 n 个元素的链表,我们访问每个元素最多一次。添加一个结点到哈希表中只需要花费 O(1) 的时间。
空间复杂度:O(n),空间取决于添加到哈希表中的元素数目,最多可以添加 n 个元素。
快慢指针
使用两个指针,一个快一点,一个慢一点.如果链表存在环的话,快的一定会追上慢的指针.
如下图:
所以,根据快慢指针法,我们可以写出如下算法:
1 | public boolean hasCycle(ListNode head) { |
复杂度分析
空间复杂度:O(1),我们只使用了慢指针和快指针两个结点,所以空间复杂度为 O(1)。