链表中环的检测

链表中环的检测

leetcode 第131题

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。

进阶:

你能用 O(1)(即,常量)内存解决此问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/linked-list-cycle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

使用Set集合存储

很容易想到,我们可以在遍历链表的时候,将遍历过的节点放入Set中.当遍历到一个节点,当前节点Set中以存在时,则表示链表有环.

代码如下:

1
2
3
4
5
6
7
Set<ListNode> set = new HashSet<>();
while(head != null){
if(set.contains(head)) return true;
set.add(head);
head = head.next;
}
return false;

复杂度分析

时间复杂度:O(n),对于含有 n 个元素的链表,我们访问每个元素最多一次。添加一个结点到哈希表中只需要花费 O(1) 的时间。

空间复杂度:O(n),空间取决于添加到哈希表中的元素数目,最多可以添加 n 个元素。

快慢指针

使用两个指针,一个快一点,一个慢一点.如果链表存在环的话,快的一定会追上慢的指针.

如下图:

双指针判断环链表

所以,根据快慢指针法,我们可以写出如下算法:

1
2
3
4
5
6
7
8
9
10
11
public boolean hasCycle(ListNode head) {
if(head == null) return false;
ListNode slow = head;
ListNode fast = head.next;
while( fast != null && fast.next != null){
if(slow == fast) return true;
slow = slow.next;
fast = fast.next.next;
}
return false;
}

复杂度分析

空间复杂度:O(1),我们只使用了慢指针和快指针两个结点,所以空间复杂度为 O(1)。

0%