快慢指针算法

参考:

https://blog.****.net/qq_30193419/article/details/93596329
https://blog.****.net/u010292561/article/details/80444057

1.寻找中间位置(链表)

先一遍遍历总长度,然后折半,再这个遍历至中间位置。

**快慢指针算法:**引入两个指针,快的一次移动两个,慢的一次移动一个,快的到终点,慢的到中间。一次遍历完成。
当然,需要考虑奇偶的情况。

比较: 快慢指针算法省下了从头再次到中间的时间。

2.找链表的倒数第k个节点

一般思路:先到终点,然后倒着找第k个。

**快慢指针算法:**引入两个指针,快的先移动k个单位,快的和慢的均一次移动1个单位,快的到终点,慢的到达倒数第k个。一次遍历完成。

比较: 快慢指针算法省下了从尾部再次走k步的时间。

3.检测单链表是否有环,返回环的入口。

相关例题:

leetcode的此题。

1.判断是否存在环:

引入两个指针,快的一次移动两个,慢的一次移动一个,最终存在相等,则有。

2.※求环的入口:

易得:两指针相遇时,快指针走过的路程为慢指针的2倍。

快慢指针算法

a+nr+b=2(a+b)(慢的也可能多次绕环,但可以抵消,a+nr+b=2(a+b)+mr)

a=nr-b

a=(n-1)r+r-b

一个慢指针slower1从链表头出发,1个慢指针slower2从b点出发,slower1走到环入口时(路程为a),slower也刚好走到环入口(路程为(n-1)r+r-b:n-1个整圈加上r-b的路程)