快慢指针
我们可以让两个指针每次递进不同的步数来巧妙的完成一些任务
1.判断链表是否有环
指定两个指针,快指针每次走两步,慢指针每次走一步,若最终两个指针指向相同的节点,则链表存在环。
代码如下:
2.找到链表环入口
通过上面的例子我们可以发现,7号节点和1号节点往前走5步都刚好到达6号节点(链表环的入口),这是巧合还是确实是这样呢?
我们可以进行如下推导:
当快慢指针相遇时,两者走的步数如下,i表示绕环走的圈数
slow = R+iD+(D-A)
fast = 2*slow
∴slow%D = fast%D
即(R-A)%D = 2*(R-A)%D
∴R = A+n*D
此时从起点和相遇点开始同步先前推进,最终便可达在环的入口节点相遇。
代码如下: