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