力扣hot100:环形链表(快慢指针法)(141)

一、题目描述


二、思路分析

这是链表题目中的经典问题,核心就是 如何判断链表是否有环

常见的两种方法有:

  1. 哈希表法:用一个集合存储访问过的节点,如果再次遇到相同节点说明有环。

    • 缺点:需要额外的空间,空间复杂度 O(n)。
  2. 快慢指针法(Floyd 判圈算法):通过两个速度不同的指针在链表中移动,如果存在环,那么快指针一定会在环中追上慢指针。

    • 优点:只需常数空间,空间复杂度 O(1)。

    • 这也是本题的最优解。

你的代码实现采用了第二种方法,也就是 快慢指针法


三、代码讲解

下面是我的实现代码:

java 复制代码
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }

        ListNode slow = head;
        ListNode fast = head.next;

        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;

            if (slow == fast) {
                return true;
            }
        }

        return true;
    }
}

1. 边界条件

java 复制代码
if (head == null || head.next == null) {
    return false;
}

如果链表为空,或者只有一个节点(且没有环),那么显然不可能存在环,直接返回 false


2. 初始化快慢指针

java 复制代码
ListNode slow = head;
ListNode fast = head.next;
  • slow 每次走一步;

  • fast 每次走两步。

    这样设计可以保证在有环的情况下,快指针一定会在环中追上慢指针。


3. 循环遍历

java 复制代码
while (slow != fast) {
    if (fast == null || fast.next == null) {
        return false;
    }
    slow = slow.next;
    fast = fast.next.next;

    if (slow == fast) {
        return true;
    }
}
  • 如果快指针走到 null,说明链表没有环(因为如果有环,快指针永远不会走到尽头)。

  • 如果 slow == fast,则说明快慢指针在环中相遇,即链表存在环。


4. 返回结果

最终,如果跳出 while 循环,说明 slow == fast,返回 true


四、复杂度分析

  • 时间复杂度:O(n)

    • 最坏情况下,快慢指针要遍历链表的所有节点,复杂度为线性级别。
  • 空间复杂度:O(1)

    • 只用了两个指针变量,不需要额外存储空间。

五、总结

  • 本题是典型的 快慢指针 应用场景。

  • 通过设置不同速度的指针来判断是否存在环,大大节省了空间。

  • 此题也是后续 环形链表 II(寻找环的入口节点)的基础。


✨ 总结一句话:
在链表问题里,如果涉及到"是否存在环",首先考虑快慢指针。

相关推荐
Boilermaker19921 天前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维1 天前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS1 天前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
独自破碎E1 天前
【二分法】寻找峰值
算法
alonewolf_991 天前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子1 天前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
sheji34161 天前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
mit6.8241 天前
位运算|拆分贪心
算法
ghie90901 天前
基于MATLAB的TLBO算法优化实现与改进
开发语言·算法·matlab
恋爱绝缘体11 天前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit