趣味算法题

越刷越上头的趣味算法题
帅旋
关注
充电
IT宅站长,技术博主,共享单车手,全网id:arthinking。

快慢指针:环形链表

发布于 2024-03-15 | 更新于 2024-03-19

题目:141. 环形链表[1]

如果您已经有思路了,或者是N刷了,可以先自己写一遍。

题目分析

环形链表问题:给定一个链表,判断链表中是否有环。如果链表中某个节点可以通过连续跟踪 next 指针再次到达自己,那么链表中存在环。为了解决这个问题,我们可以使用快慢指针(Floyd的循环查找算法)技术。

快慢指针是解决环形链表问题的经典技术。它不仅可以用来判断链表中是否存在环,还可以用来找到环的起点,甚至计算环的长度。

解题思路

快慢指针技术涉及两个指针,一个是快指针,另一个是慢指针。快指针每次移动两步,慢指针每次移动一步。如果链表中没有环,快指针将达到链表的末尾。如果链表中有环,快指针最终将追上慢指针(因为每次循环它们之间的距离减少1)。

Java解法

下面是使用Java语言的解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
// 定义快慢指针
ListNode slow = head, fast = head;
while (fast != null) {
// 慢指针移动一步
slow = slow.next;
// 判断快指针是否到达链表末尾
if (fast.next != null) {
// 快指针移动两步
fast = fast.next.next;
} else {
return false;
}
// 快慢指针相遇
if (slow == fast) {
return true;
}
}
return false;
}
}
  • 空间效率高:这种方法的空间复杂度为 O(1),因为它只需要常数级别的额外空间。
  • 时间复杂度:在最坏的情况下,时间复杂度为 O(n),其中 n 是链表中的节点数。这是因为快指针最多会遍历整个链表一次才能确定是否有环。

References


  1. 141. 环形链表 ↩︎

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/algorithm/linked-list-cycle.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。