快慢指针总结

作者: 乔淑瑞 | 来源:发表于2021-04-25 12:58 被阅读0次

快慢指针

所谓「快慢指针」是指设定两个指针,其中快的指针的移动速度是慢的指针的移动速度的两倍;“快慢指针”方法主要用来解决两类问题,即“判断一个链表是否为循环链表”以及“寻找一个有序链表的中位数”

判断一个链表是否为循环链表

思路: 当我们在遍历链表的时候,我们设计两个指针,分别是快指针和慢指针,块指针每次走2步,而慢指针每次走1步,这样的话在当我们两个指针在链表中,如果会第二次相遇则说明这里面的链表是环形链表。

publicbooleanhasRing() {

if(head !=null&& size > 0) {

Node<T> fastTemp = head, lowTemp = head;

while(lowTemp.getNext() !=null&& fastTemp.getNext() !=null) {

fastTemp = fastTemp.getNext().getNext();

lowTemp = lowTemp.getNext();

if(lowTemp == fastTemp) {

return true;

}

}

}

return false;

}

假设: 快慢指针在C点相遇,那么相遇点在离循环点B之间是x 那么头节点A离B的距离为 k 

在相遇的时候

慢指针:K + X + n*(X+Y) = m;   ①

X+Y 绕环一圈的距离;n 慢指针 总共绕了几圈在环内

快指针: 

快指针是慢指针 速度的2倍,当它们相遇时 所用的时间是一样的。那么快指针 走过得距离是2*m;

K+X +N*(X+Y) = 2*m;   ②

N为快指针绕过得圈数

将 ② - ①  得到下面公式

(N-n)*(X+Y) = m;

接下将 ① 代入 上式得到

 (N-n)*(X+Y) = K+X+n*(X+Y);

这里X+Y 环长是个定值。 假设环长为M

(N-n)*M = K+X+n*M; ---- > 得出变形得到 K+X = (N-2*n)*M ;

公式 :K+X = (N-2*n)*M  

由于我们设计的是O型循环链表,那么 起始就是循环点B上,则(N-2*n)*M = 0。

N = 2*n;  相遇时 快慢指针所绕 环的圈数 前者是后者的2倍,所用时间相同。这里跟环有多少节点没有关系。

相关文章

  • 快慢指针总结

    快慢指针 所谓「快慢指针」是指设定两个指针,其中快的指针的移动速度是慢的指针的移动速度的两倍;“快慢指针”方法主要...

  • 快慢指针的应用

    快慢指针 快慢指针中的快慢指的是移动的步长,快慢分别指的是快指针每次移动两步,满指针每次移动一步 快慢指针的应用 ...

  • leetcode第142题:环形链表II [中等]

    题目描述 考点 链表 双指针(快慢指针) 解题思路 设置快慢指针slow, fast; 慢指针slow每次移动一个...

  • 快慢指针

    快慢指针即我们有两个及以上的指针,我们可以通过控制其步长去实现某种行为。 下图中自定义的名词解释如下: 目标节点:...

  • 快慢指针

    找出单向链表中倒数第 k 个节点。返回该节点的值普通解法时间复杂度2N 用快慢指针只用循环一遍N就行了

  • 快慢指针

  • 链表算法之-链表找环

    思想:快慢指针

  • [go语言算法] 输出链表的倒数第k个节点

    快慢指针法

  • 双指针

    一、双指针总结 1.1题目 快慢指针(主要解决链表中的问题) 141.环形链表 142.环形链表 II 876.链...

  • 快慢指针的应用

    快慢指针的快慢主要是指在遍历链表过程中指针移动速度的快慢。比如遍历单链表,我们可以让指针每次移动一个节点,也可以让...

网友评论

    本文标题:快慢指针总结

    本文链接:https://www.haomeiwen.com/subject/vbeulltx.html