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

Leetcode—环形链表||

题目描述

思路

 快慢指针

结论

我们需要用到一个重要的结论:让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。

画图解释

1.利用快慢指针找到相遇点

2. 定义两个指针,pcur从链表的起始位置开始遍历,slow(fast)从相遇点开始遍历,pcur和slow均走一步,两个指针相遇的位置是入口点。

 证明结论

是不是觉得上面的过程是个巧合?那我们来证明一下!

说明: H为链表的起始点,E为环入口点,M是判环时候相遇点
设: 环的长度为R,H到E的距离为L,E到M的距离为 X ,则:M到E的距离为R-X
在判环时,快慢指针相遇时所走的路径的长度:
    fast:L+X+nR
    slow: L+R
注意:
   1.当慢指针进入环时,快指针可能已经在环中绕了n圈了,n至少为1。
      因为:快指针先进环走到M的位置,,最后又在M的位置与慢指针相遇。
 
 2.慢指针进环之后,快指针肯定会在慢指针走一圈之内追上慢指针
      因为:慢指针进环后,快慢指针之间的距离最多就是环的长度,而两个指针在移动时,每次它们至今 的距离都缩减一步,因此在慢指针移动一圈之前快指针肯定是可以追上慢指针的,而快指针速度是慢 指针的两倍,因此有如下关系是:
      2*(L+X)=L+X+nR
      LX=nR 
      L=nR-X 
      L=(n-1)R+(R-X)
(n为1,2,3,4......,n的大小取决于环的大小,环越小n越大)
极端情况下,假设n=1,此时:L=R-X
即:一个指针从链表起始位置运行,一个指针从相遇点位置绕环,每次都走一步,两个指针最终会在入口点的位置相遇

完整代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode *detectCycle(struct ListNode *head) 
{ListNode*slow=head;ListNode*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;if(slow==fast){//相遇ListNode*pcur=head;while(pcur&&slow){if(pcur==slow){return pcur;}pcur=pcur->next;slow=slow->next;}}}//说明链表不带环return NULL;
}

      

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 下载chromedriver驱动
  • openmv与stm32通信
  • 面试经典150题——多数元素
  • 基于深度学习的因果推理与决策
  • AI+RPA 实战揭秘:DrissionPage 助力 CSDN 热榜数据抓取与 AI 结合
  • 跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例
  • 2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
  • FPGA与Matlab图像处理之伽马校正
  • RusTitW:大规模语言视觉文本识别数据集(猫脸码客 第190期)
  • CAD图纸加密软件哪个好?10款2024主流CAD图纸加密软件分享!
  • 监控易监测对象及指标之:全面监控FTP服务器
  • ubuntu服务器版NVIDIA驱动失效解决方案
  • 宝塔Linux部署 Vue + Spring Boot + MySQL + Redis
  • C++中一般指针,指针数组,数组指针
  • Java入门,初识Java
  • ES6--对象的扩展
  • isset在php5.6-和php7.0+的一些差异
  • laravel5.5 视图共享数据
  • mysql 数据库四种事务隔离级别
  • npx命令介绍
  • PAT A1092
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SQL 难点解决:记录的引用
  • Tornado学习笔记(1)
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 当SetTimeout遇到了字符串
  • 构建二叉树进行数值数组的去重及优化
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 你真的知道 == 和 equals 的区别吗?
  • 如何学习JavaEE,项目又该如何做?
  • 一天一个设计模式之JS实现——适配器模式
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #Lua:Lua调用C++生成的DLL库
  • $L^p$ 调和函数恒为零
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (TOJ2804)Even? Odd?
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (三分钟)速览传统边缘检测算子
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)shell中括号的特殊用法 linux if多条件判断
  • .Net 4.0并行库实用性演练
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net中ListT 泛型转成DataTable、DataSet
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • ?php echo ?,?php echo Hello world!;?
  • [100天算法】-二叉树剪枝(day 48)
  • [AAuto]给百宝箱增加娱乐功能