当前位置: 首页 > news >正文

力扣HOT100之链表:142. 环形链表 II


这道题已经刷过3回了,还好还记得思路,直接一遍过,说下主要的思路。
首先要判断一个链表是否有环,我们就需要定义快慢指针进行判断,在起始阶段,快慢指针都指向链表的头节点,然后进行循环,当快指针fastfast -> next不为空时循环继续,若循环退出,就说明链表中没有环,直接返回nullptr,若在循环内出现了快慢指针相遇的情况,则说明链表内有环,我们进行下一步分析,如下图所示。

假设从链表头节点到环的入口的距离为x,从入口到快慢指针相遇处(沿前进方向)的距离为y,从快慢指针相遇处到环的入口(沿前进方向)的距离为z,当快慢指针相遇时,慢指针在环内一定没走完一圈(详细证明可以看我的这篇博客),则快慢指针的路程关系为2倍的关系,根据上面的性质我们可以得到一个原始的等式,然后经过一步步化简可以得到划红线的结果,其重要性质已经用红字写出,根据上面的性质,我们可以新定义一个慢指针result,从链表头节点出发,每次只移动一个节点,而慢指针slow同时继续向前进,当slowresult相遇时,slow走的路程为z+(n - 1)(y + z)(n - 1圈+z),而result走了x,当二者相遇时,相遇处就是入口,直接返回即可。

/**
 * 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 && fast -> next){
            fast = fast -> next -> next;  //快指针走两步
            slow = slow -> next;    //慢指针走一步
            if(fast == slow){  //链表有环且在环内相遇
                ListNode* result = head;
                while(result != slow){
                    result = result -> next;
                    slow = slow -> next;
                }
                return result;
            }
        }
        return nullptr;   //链表无环
    }
};
http://www.dtcms.com/a/118005.html

相关文章:

  • Spring MVC 返回 JSON 视图的方式及对比(6种)
  • [Linux系统编程]多线程
  • 从ERTS会议学习Scade的发展
  • x-cmd install | Slumber - 告别繁琐,拥抱高效的终端 HTTP 客户端
  • 软件工程第三章习题
  • 【蓝桥杯】Python大学A组第十五届省赛
  • 大数据处理全链路优化:从并行文件处理到可视化加速的工程实践
  • 【Linux工具篇】保姆级配置vscode连接远端主机以及免密配置
  • react 18 可中断的理解以及应用
  • 蓝桥杯第十二届省赛B组C++真题解析
  • 4.7正则表达式
  • el-select组件与el-tree组件结合实现下拉选择树型结构框
  • 深度学习实战电力设备缺陷检测
  • leetcode 416. 分割等和子集 中等
  • 科技快讯 | DeepSeek 公布模型新学习方式;Meta发布开源大模型Llama 4;谷歌推出 Android Auto 14.0 正式版
  • IntelliJ IDEA下开发FPGA
  • 【go】类型断言
  • 学习海康VisionMaster之直线查找组合
  • ResNet改进(22):提升特征选择能力的卷积神经网络SKNet
  • 深入解析 MySQL 底层架构:从存储引擎到查询优化
  • 时序数据库 TDengine × Excel:一份数据,两种效率
  • 借助 AI 工具使用 Python 实现北京市店铺分布地理信息可视化教程
  • Spark,IDEA编写Maven项目
  • 硬盘分区格式之GPT(GUID Partition Table)笔记250406
  • (复看)CExercise_06_1指针和数组_2 给定一个double数组,求平均值,并且返回
  • 第二章:访问远程服务_《凤凰架构:构建可靠的大型分布式系统》
  • React 多个 HOC 嵌套太深,会带来哪些隐患?
  • mac命令操作
  • 在huggingface上制作小demo
  • 初阶C++笔记第一篇:C++基础语法