码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 环形单链表问题


    1. 链表有无环判断方法

    思路:

    利用快慢指针,如果快每次走两个,慢指针每次走一个,则最终必然会相遇。

    证明:
    先猜想:是否快会跟慢永不相遇,在环内可能跨过慢

    存在环时,快先入环,慢后入环,假设慢入环时,两者相差N,快慢指针两者每走一次,相差1,所以两者的差距N会有消为0的时候。

    bool hasCycle(struct ListNode *head) {
        struct ListNode* fast = head;
        struct ListNode* slow = head;
        // 要做fast->next遍历,但是只写while f->next必然会出错 因f会有不存在情况
        while(fast && fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;
            if(fast == slow)
            {
                return true;
            }
        }
        return false;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 带环链表快慢指针相追赶问题

    假设慢指针是s,快指针是f

    1. s走1,f走3,两者一定会相遇吗?
    1. 设进入环后差为N,s、f每走一次,两者差距变为N-2,N-4,N-6,如果N是偶数,那么会有为0的情况,如果N是奇数,就不会相遇。因为差距会从1到-1、-3。。。
    1. s走1,f走4,两者会相遇吗?

    设进入环后差为N,s、f每走一次,两者差距变为N-3,N-5,N-7,所以也不一定相遇。N为3的倍数,可能会相遇。

    1. s走1,f走n,两者会相遇吗?

    由2我们已经能推出来了,如果两者入环后的差距N是两者速度差n-1的倍数,那么就会相遇。

    1. s走m,f走n,两者会相遇吗?

    仍然是:若 ** N % (m-n) == 0:则必定相遇 **,其它情况,可能相遇也可能不想与

    3. 环节入口点判断、相遇节点判断

    1. 求交点:假设快f指针是慢指针s的两倍。
    2. 当相遇时,f、s走过的路程设为sf、ss。则有 sf = 2ss。
    3. 假设入环前,长度为L,入环后,至相遇走了X,Ss = L+X+Mc Sf = L+X+Nc,M和N分布代表它们俩入环后走了几圈才相遇。而慢指针不可能走1圈,S刚入环后,两者差N,而两者的距离n小于C,因为两者差距不可能是环大小,n
    4. Ss = L+X,Sf = L+X+Nc。再由于两者2倍的关系: 化简得到:
    5. L+X = NC => L = NC-X => L = (n-1)C+C-X
    6. 由最后一个公式可以理解到:两个指针以同样的速度,一个在环外起点,一个在环内相遇点(相遇点可用本文部分1中方法求得)开始走,最终会在C-X处相遇,C-X即环入口。
      最后,我再留一张,自己推算的稿纸:

    请添加图片描述

  • 相关阅读:
    【Settings随记:二】一级菜单,二级菜单的添加与隐藏,添加辅助功能
    在IDEA本地开发时Flink CDC和Flink的guava版本冲突解决办法
    5-网络架构和Netty系列-Bootstrap和Channel源码分析
    YoloV8改进策略:将FasterNet与YoloV8深度融合,打造更快更强的检测网络
    Linux setleds命令教程:如何控制键盘LED灯(附实例详解和注意事项)
    【Arduino+ESP32专题】模拟I/O的使用——ADC
    Xray 漏洞扫描工具使用方法
    西门子精彩触摸屏SMART V3组态报警的具体方法示例
    [Redis]-四种部署方式
    【网络编程】高并发服务器|网络套接字函数|TCP服务器函数-大端小端
  • 原文地址:https://blog.csdn.net/myscratch/article/details/126412615
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号