力扣hot100-环形链表(2)142

这是一个经典的链表算法题,通常使用**快慢指针法(Floyd 判圈算法)**来解决。这种方法不需要额外的存储空间,时间复杂度为 O(N)。

算法思路解析

  1. 判断是否有环

    • 使用两个指针 fastslow

    • fast 每次走两步,slow 每次走一步。

    • 如果链表中没有环,fast 最终会遇到 nullptr

    • 如果链表中有环,fast 最终会追上 slow,两者会在环内相遇。

  2. 寻找环的入口

    • fastslow 相遇时,假设链表头到环入口距离为 x,环入口到相遇点距离为 y,从相遇点再回到环入口距离为 z

    • 相遇时,slow 走了 x + yfast 走了 x + y + n(y + z)(即多走了 n 圈)。

    • 因为 fast 速度是 slow 的两倍,所以:2(x + y) = x + y + n(y + z)

    • 化简得:x = (n - 1)(y + z) + z

    • 这个公式的含义是:从头节点出发的指针从相遇点出发的指针 ,同时每次走一步,它们最终会在环的入口节点相遇。

复杂度分析:

  • 时间复杂度O(N)。在判断是否有环时,快慢指针最多遍历链表一次;寻找入口时,也最多遍历一次。

  • 空间复杂度O(1)。只使用了几个指针变量,没有使用额外的数组或哈希表。

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 * int val;
 * ListNode *next;
 * ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        // 定义快慢指针,初始都指向头节点
        ListNode* fast = head;
        ListNode* slow = head;
        
        while (fast != nullptr && fast->next != nullptr) {
            // 慢指针走一步
            slow = slow->next;
            // 快指针走两步
            fast = fast->next->next;
            
            // 如果快慢指针相遇,说明链表中存在环
            if (slow == fast) {
                // 此时,我们需要找到环的入口
                // 根据数学推导:
                // 从头节点出发一个指针 index1
                // 从相遇节点出发一个指针 index2
                // 它们每次都走一步,最终会在环的入口处相遇
                
                ListNode* index1 = fast;
                ListNode* index2 = head;
                
                while (index1 != index2) {
                    index1 = index1->next;
                    index2 = index2->next;
                }
                
                // 返回环的入口节点
                return index2;
            }
        }
        
        // 如果循环结束(fast 遇到 null),说明没有环
        return nullptr;
    }
};
相关推荐
fie88892 小时前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
晨晖23 小时前
单链表逆转,c语言
c语言·数据结构·算法
YoungHong19923 小时前
面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
leetcode·面试·职场和发展
im_AMBER4 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
鼾声鼾语5 小时前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
LYFlied5 小时前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
Swizard5 小时前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
s09071365 小时前
紧凑型3D成像声纳实现路径
算法·3d·声呐·前视多波束
可爱的小小小狼5 小时前
算法:二叉树遍历
算法
d111111111d6 小时前
在STM32函数指针是什么,怎么使用还有典型应用场景。
笔记·stm32·单片机·嵌入式硬件·学习·算法