力扣hot100-141.环形链表

这是一个经典的链表问题,通常被称为"判断链表是否有环"。

解决这个问题的标准且最高效的解法是 快慢指针算法(也称为 Floyd 判圈算法或龟兔赛跑算法)。

解题思路

  1. 定义两个指针

    • 慢指针 (slow):一次走一步。

    • 快指针 (fast):一次走两步。

  2. 逻辑分析

    • 如果没有环fast 指针走得快,最终会遇到 NULL(即到达链表末尾),此时可以直接返回 false

    • 如果有环fast 指针会率先进入环,并在环内循环。当 slow 指针也进入环后,这就变成了一个"追及问题"。因为 fastslow 每次多走一步,所以在有限的步数内,fast 一定会追上 slow(即 fast == slow)。

  3. 复杂度

    • 时间复杂度O(n)。如果无环,遍历一次;如果有环,快指针在环内绕圈追上慢指针的时间也是线性的。

    • 空间复杂度O(1)。只使用了两个指针,不需要额外的哈希表来存储已访问的节点。

下面是完整的代码实现,包含了解题类和用于构建带环链表进行测试的 main 函数。

代码要点

  1. 初始化slowfast 都指向 head。有些写法会让 fast 初始指向 head->next,这也是可以的,但循环条件和判断逻辑稍微不同。让它们都从 head 开始是最直观的。

  2. 循环条件while (fast != NULL && fast->next != NULL)。这个条件非常关键,它保证了 fast->next->next 不会出现空指针异常。

  3. 相遇判断 :在移动指针之后立即检查 if (slow == fast)。如果相等,说明快指针追上了慢指针,链表有环。

  4. 返回结果:如果循环正常退出,说明快指针遇到了空指针,链表没有环。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == NULL ||  head->next == NULL)
            return false;
        
        ListNode* fast = head;
        ListNode* slow = head;
        
        while(fast != nullptr && fast->next != nullptr)
        {
            slow = slow->next;
            fast = fast->next->next;
            if(slow == fast)
                return true;
        }

        return false;
    }
};
相关推荐
风筝在晴天搁浅17 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发19 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星25 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅27 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程41 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数
数据皮皮侠2 小时前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora2 小时前
Python 算法基础篇之链表
python·算法·链表
科研前沿2 小时前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算