• 关于如何找环形链表的入环点


    一、判断一个链表是否有环

    给你一个链表的头节点 head ,判断链表中是否有环。
    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
    如果链表中存在环 ,则返回 true 。 否则,返回 false 。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    解题思路:

    快慢指针,慢指针一次往后走一步,快指针一次往后走两步。这样快指针会比慢指针先入环,当慢指针入环被快指针追上时,说明这是一个环形链表,当快指针为空或者指向空时,说明这不是环形链表,返回NULL。

    在这里插入图片描述
    为什么肯定slow 和 fast一定会相遇呢?我们假设当slow入环时,fast到slow的距离为N。
    在这里插入图片描述
    而slow 每次往前走一步,fast 每次往前走两步,那么它们的距离是逐渐递减的。
    在这里插入图片描述
    最后它们之间的距离为 0 时,它们就相遇了。

    那问题来了,如果fast 一次走三步,四步,五步,它能不能在环中与slow相遇呢? 我们假设fast一次走三步。
    fast到slow的距离继续为N
    在这里插入图片描述

    slow 一次走一步, fast一次走三步 , 那么N是每次少2
    在这里插入图片描述
    此时会出现两者情况,一种情况是相遇了,还有一种情况是没相遇。
    当没相遇的时候,fast已经跑到了 slow的前面,也就是它们此时的距离是-1。
    在这里插入图片描述
    设这个环的长度为C,所以它们的距离 N 此时是等于 C-1的。而因为fast一次是走三步的,所以N每次会-2。 当N等于0时它们才会相遇,这也就意味,C-1 如果是偶数,那么它们才会相遇,如果C-1 是奇数,那它们永远不会相遇。所以,fast 一次走两步,它一定会和slow在环里面相遇,slow不用走完一圈。如果fast一次走3,4,5…n步,那么是有可能永远不会与slow相遇的。

    代码如下:

    bool hasCycle(struct ListNode *head) {
       
        struct ListNode* slow = head;
        struct ListNode* fast = head;
    
        //如果fast为空或者指向空,说明不是环形链表
        while(fast 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    MT3520B 丝印AS20B 2A电流 2.3V-6V输入、1.5MHz同步降压转换器
    Java中单例模式
    Java异常编程题(巩固语法)
    go下载依赖时超时timeout
    Hadoop3教程(十七):MapReduce之ReduceJoin案例分析
    vue实现单页面仿照购物车案例——基于mint-ui和vue2.0
    前端优化方案--改善 JS 性能
    AI_Neural Network_Note(一)
    手把手从零开始训练YOLOv8改进项目(官方ultralytics版本)教程
    tomcat部署
  • 原文地址:https://blog.csdn.net/a778129656/article/details/128148073