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

数据结构每日一题|判断链表环形结构并返回环的起始节点

仅记录做题思路 题目均来自力扣

//找出环形的起始节点
 struct ListNode* detectCycle(struct ListNode* head) {
     ListNode* fast = head;//快指针 每次走两步
     ListNode* slow = head;//慢指针 每次走一步
    
     while (fast != NULL && fast->next != NULL)  //排除输入为空节点的情况
     {
         fast = fast->next->next;
         slow = slow->next;
         if (fast == slow)//这里找到了快慢指针的相遇点,
         {
             ListNode* sloww = head;//最后登场的指针
             while (slow != sloww) //从此开始找慢指针和超慢指针的相遇点
             {
                 sloww = sloww->next;
                 slow = slow->next;
             }
             return sloww;
         }
     }
     return NULL;
 }

怎么判断是否存在环形结构请查看上一篇文章,这里只讨论找环形结构的起始节点

思路:先将问题形象化,以下是变化的过程

初始的假设条件:快指针的移动速度为每次2节点,慢指针为1节点 

然后设

进入节点前的路程为a

慢指针进入节点后走了  b  与快指针相遇

环的一圈减去b剩下的设为 c

快指针走了   n圈+b  = n(b+c)+b 与慢指针相遇

可得关系式  a+(b+c)× n+b  = 2×(a+b)

化简得 a = n ×( b+c )—b

结合图理解

如果能求出a,就相当于求得了环的起始节点(用一个新的指针从起始头节点遍历a个距离的节点)

看式子的右边

我们假设快慢指针相遇后,慢指针此时从相遇点开始新的旅程,同时一个新的和他速度一样的每次走一个节点的指针从起始位置出发,当慢指针走完n圈再减去b就回到了环的起始节点,因为速度一样,所以等于 新的指针走过来的a

结合以上条件即可写出代码求解

 


http://www.kler.cn/a/409880.html

相关文章:

  • Vue——响应式数据,v-on,v-bind,v-if,v-for(内含项目实战)
  • 【Mysql】视图--介绍和作用 视图的创建
  • vscode可以编译通过c++项目,但头文件有红色波浪线的问题
  • 量子卷积神经网络
  • 泷羽sec学习打卡-超文本协议和内外网划分
  • Javaweb前端HTML css 整体布局
  • QT6 android生成release版本注意事项
  • 【VRChat 改模】着色器(shader)简介、预制体(prefab)简介
  • 日志抽取工具——flume的安装与使用教程
  • 学习路之压力测试--jmeter安装教程
  • 施密特正交化与单位化的情形
  • 排序算法1
  • C++设计模式-策略模式-StrategyMethod
  • 如何在 PyTorch 分布式训练中使用 TORCH_DISTRIBUTED_DEBUG=INFO 进行调试
  • Spring Boot 同时接受文件和实体及 Postman 测试实战
  • Vue3(JavaScript框架)(响应式数据ref,v-on、v-show、v-is、v-for、v-bind)
  • Linux网络——NAT/代理服务器
  • DAMODEL丹摩| 智谱清影 -CogVideoX-2b-部署与使用
  • 使用 Maven 构建一个简单的 Java 项目
  • C#水仙花
  • 请求响应(学习笔记)
  • 亚信安全发布《2024年第三季度网络安全威胁报告》
  • SPFA算法
  • STL(一)
  • C# Dictionary实现原理
  • 面向对象高级(9)包装