首页 > 其他分享 >有环快慢指针相遇问题

有环快慢指针相遇问题

时间:2022-08-16 16:36:10浏览次数:54  
标签:快慢 slow Ss 环内 相遇 链表 有环 quick 指针

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)圈;

标签:快慢,slow,Ss,环内,相遇,链表,有环,quick,指针
From: https://www.cnblogs.com/liubilan/p/16591392.html

相关文章

  • leetcode-双指针-21
    /**<p>给你一个数组<code>nums</code><em></em>和一个值<code>val</code>,你需要<strong><ahref="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3......
  • 关于Microsoft office 2021 家庭与学生版本的通病问题的有关记录_其中的excel在单元格
    该问题已测试2台电脑的office2021家庭与学生版本,均出现同样的问题鼠标操作为匀速下拉,注意观察行数变化速度,在数据区域的下拉行数变化速度慢(甚至最后的时候一行一行的变化),......
  • 指针常量和常量指针
    #include<iostream>usingnamespacestd;intmain(){ intm=0; constintn=2;//必须初始化其n不可修改如像常量一样// n=3;错误 constint*ptr1=&m; int......
  • 一步到位:指针与const关键字
    const关键字为C++/C中的关键字,const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。这个常类型可以是指针,也可以是int等变量。const的用法常见有以下四......
  • C语言指针的使用运算与数组相关编程实例
    指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。本......