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

算法与数据结构(环形链表II)

题目

思路

这个题其实与之前环形链表的题差不多,这个麻烦的一点是需要你返回入环的第一个节点。

若我们继续用哈希表还是很简单,就是继续遍历链表,遇到的第一个重复的值即为入环的第一个节点。

这里我们看一下快慢指针的方法。

这里我们假设a为链表开头到入环第一个节点的距离。b为入环第一个节点到相遇点之间的距离,c为环剩下的距离。

我们让快慢指针都从链表开头部分开始移动,慢指针每次移一个距离,快指针每次移两个距离。

若相遇,则慢指针的移动距离为a+b,快指针移动的距离为a+n(b+c)+b。

快指针的移动距离是慢指针的2倍,由此可知a+n(b+c)+b=2(a+b)。

则a=(n-1)b+nc  ,  a=(n-1)(b+c)+c。

所以a的距离就等于n-1圈的距离加上c。

若可以相遇,则将链表的开头定义为ptr,ptr和slow每次分别移动一格,当ptr将a走完的时候,一定会与slow在入环的第一个节点相遇,此时返回ptr即可。

代码

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head,*slow=head;
        while(fast)
        {
            slow=slow->next;
            if(fast->next==nullptr) return nullptr;
            fast=fast->next->next;
            //若相遇
            if(fast==slow)
            {
                ListNode* ptr=head;
                while(ptr != slow)
                {
                    ptr=ptr->next;
                    slow=slow->next;
                }
                return ptr;
            }
        }
        return nullptr;
    }
};

相关文章:

  • Python天梯赛L1-018-大笨钟详解
  • [杂学笔记]工厂模式、多态、内存空间区域划分、cp指令破坏软连接问题、UDP如何实现可靠传输、滑动窗口的原理、进程与线程、线程之间的通信
  • 案例|某开关站室外轮式巡检机器人解决方案
  • ELK之elasticsearch基本使用教程
  • 常用的HTML meta标签有哪些
  • 【SoC设计的简单艺术】第九章:芯片级的复杂性
  • JavaWeb校园二手交易平台(附源码+数据库脚本)
  • rtpengine build mr12.5.1 镜像
  • C++ DAY4
  • 面试题 - Vue 3 如何优化性能?
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter22-处理 XML
  • 【量化-什么是信息?怎么有效的学习?关键字摘取】
  • [KashiCTF 2025] Crypto/Pwn
  • Docker Compose一键部署Spring Boot + Vue项目
  • 微前端 Micro app
  • 数学建模之数学模型—2:非线性规划
  • MySQL 连表查询:原理、语法与优化
  • 005:Cesium.viewer 知识详解、示例代码
  • 小迪安全-24天-文件管理,显示上传,黑白名单,访问控制
  • 【R语言】dplyr包经典函数summarise函数
  • 视觉周刊|走进变革中的博物馆
  • 以色列称“将立即允许恢复”人道主义物资进入加沙
  • 泽连斯基与美国副总统及国务卿会谈,讨论伊斯坦布尔谈判等问题
  • 梅花奖在上海|秦海璐:演了15年《四世同堂》,想演一辈子
  • 多少Moreless:向世界展示现代中式家具的生活美学
  • 上海博物馆展览进校园,“小先生”传递文物知识