有环快慢指针相遇问题
quick快指针速度 Vq=2Vs, slow慢指针速度Vs,首先在环内一定会相遇这里就不阐述了;
(借用下别人的图(谢谢那位))背景:环的起点为X,从链表到X的距离为x,假设quick和slow在Z点相遇,且X到Z距离n;
Q1:第一次相遇一定会发生在slow在环内第一圈的时候;
假设环长C,slow刚进入环的时候位于X,quick位于环内任意点,假设quick处在正向距离X点k (0<=k<C)处;
将X视为原点,一维坐标移动。经过时间 t 第一次相遇时slow走过的距离Ss=Vs*t,quick走过的距离为Sq=C-k+Ss(先从当前点移动到X点,再加上slow移动的距离),又因为运动时间相同,有Sq=Vq*t=2*Vs*t,因此C-k+Ss=2Vs*t=2Ss,得Ss=C-k,因此第一次相遇一定会发生在slow在环内第一圈的时候。
此时Sq=2Ss,此时quick在第几圈受C和x影响,最多不会超过Vq/Vs圈。#
Q2:求环开始的节点,即X的位置;
第一次相遇时的状态:(第一次相遇可 if 内获得相遇点Z点位置)slow在环内第一次到Z点,Ss=x+n;Sq=2Ss=2(x+n);
quick比slow多走Sq-Ss=x+n,但仍在同一点相遇,因此x+n=k*C(k为正整数);
从链表头节点到X点的距离 x,加上k*C仍会在环的起点X点,也就是x+k*C=x+(x+n)=2x+n会停在环的起点;
因此 2x+n = x+n(从链表头节点到第一次相遇Z点)+x(从链表头节点到环起点X点);可知只需在Z点时再走距离x可回到环的起点X点,将slow或quick其一定位至链表头节点,假定为slow指向链表头节点,此时quick仍在Z点,slow与quick此时用相同速度走,slow与quick走x步后会在X点相遇,此时相遇点即为X点;#
Q3:关于速度;
假设slow与quick都在环内,slow在前,quick在后追赶slow,quick与slow相距距离x,环长C;
quick速度Vq=k*Vs;
quick走完整一圈所需时间 t=C/Vq,此时slow走了Vs*t=C/k;quick与slow缩短了Sq-Ss = C - C/k = C*(k-1)/k;
因此quick需要走x/(C*(k-1)/k)=(k/(k-1)) * (x/C)圈与slow相遇;
当x=C时,即slow与quick原本已相遇在同一点,下一次再相遇需要quick走k/(k-1)圈;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?