快慢指针和链表

快慢指针和链表的环

相信用快慢指针确定链表是否有环大家并不陌生,但是如何确定这个链表环起点的位置是一个问题。

为了深入了解,我画了个图方便理解。

下图表示了快慢指针的流程,现在假设(有环):

快慢指针都从起点B开始,快慢指针最终相交于点C,环的起点位于S。

我们假设慢指针走了 k 的距离,那么快指针走了 2k 的距离,其中(0<k<2k<n),设 SC 的距离为m,注意是顺时针(S到C)的距离,那么:

 

 可知,BS的距离为 k-m,我们现在 CS 的距离未知,我们假设其为 x,现在来求解x

我们知道快指针走了 2k 的距离是吧,也就是 BS + SC + CS +SC = 2k

那么, k-m + m + x + m = 2k;  可知 x = k-m,好像发现了不得了的事情!!!,CS和BS距离是一样的!!!

我们通过快慢指针确定了交点C后,只要让快指针指向B,速度设置为和慢指针一样为1,让慢指针从C开始,一起走,只要他们相遇,就一定是在环起点S相遇。CS = BS = k-m

 

因此,快慢指针确定环起点的结论就是,让快指针变成慢指针从起点开始,让慢指针从交点开始,一起走,相遇的点就是环的起点。

快慢指针和中位数

 用快慢指针确定中位数原理很简单,同样是让快指针速度为2,慢指针速度为1,当快指针走到头时,慢指针就会留在中位数的地方。

奇数长度情况:

0  1  2  3  4  5  6

快指针3次结束,慢指针3次停留在 3 上面,正好是中位数,完全正确

偶数长度情况:

0  1  2  3  4  5

快指针3次结束,慢指针3次停留在3上面,位于中间偏右位置,想要停留在中间偏左位置的话:当快指针走不足两格位置时,不算该次数,那么快指针走2次,慢指针走2次停在 2 上面。

 

快慢指针和倒数第K个数

用快慢指针得到倒数第K个数非常简单,一次遍历即可。

0  1  2  3  4  5  6  7

求倒数第 k 时,我们让快慢指针速度都为1,让快指针先走 k 步 后再同步走,这样当快指针到头的时候,慢指针正好停留在倒数第k个位置上面。

 

posted @ 2020-09-25 15:25  WoodInEast  阅读(219)  评论(0)    收藏  举报