美文网首页
循环链表:快慢指针进阶:找入口

循环链表:快慢指针进阶:找入口

作者: 段段小胖砸 | 来源:发表于2021-07-12 17:46 被阅读0次
image.png

力扣142


image.png

如上图,判断是否为循环链表,和上一题一样,使用快慢指针即可。然后看一下怎么找循环入口点:
slow指针走过的节点数为: x + y
fast指针走过的节点数: x + y + n (y + z),n为fast指针在环内走了n圈才遇到slow指针
所以x + y = x + y + n (y + z)
最后化简:x = n (y + z) - y,我们首先要确定一点,就是慢指针走过的距离一定是x+y,因为快指针一定会在慢指针走完环形(即x+y)这个圈第一圈之前相遇,其次再确认一点,快指针一定不会跳过慢指针移动,因为快指针相对于慢指针一次只移动一个节点。
根据上述可以证明 x = n圈环形链表的长度 - y,那么类比运动会跑步,就是跑的快的甲和跑的慢的乙相遇的时候,
x = 甲跑了n-1圈 + z
那么如果去除环绕圆跑的距离,x = z。所以从相遇点到环形链表入口和起点到环形链表入口距离想等。

public class Solution {
    public ListNode detectCycle(ListNode head) {
      // 在此处写入代码
         ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;//快指针走两步
            slow = slow.next;//慢指针走一步
            if(fast == slow)  break; //相遇代表有环
        }
        if(fast == null || fast.next == null)return null;
        slow = head;//慢指针回到链表头部
        while(fast != slow){
            slow = slow.next;
            fast = fast.next;//快指针也调整为一次走一步
        }
        return slow;
    }
}

相关文章

  • 循环链表:快慢指针进阶:找入口

    力扣142 如上图,判断是否为循环链表,和上一题一样,使用快慢指针即可。然后看一下怎么找循环入口点:slow指针走...

  • 数据结构与算法整理

    (1)链表的技巧 快慢指针(找环,环入口,环长度) 双指针(倒数K个节点) 合并链表(递归求解) 约瑟夫环(环形链...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • 面试题20:链表中环的入口节点

    题目:如果一个链表中包含环,如何找到环的入口节点思路:分为判断是不是有环,找环的入口 快慢指针,如果快指针能够追上...

  • 循环链表:快慢指针

    解决方案1:循环链表遍历放入数组,然后循环看节点是否存在于数组中,比较简单,就不实现了解决方案2:快慢指针

  • 检测链表中的循环

    给定一个链表,检查链表是否有循环。下图显示了带有循环的链表。 解题思路 使用快慢两个指针遍历链表。将慢指针(slo...

  • 判断单链表环的快慢指针法

    快慢指针法 算法步骤 初始化快慢指针 循环处理,快指针走两步,慢指针走一步,直到发现环或者到达链表结尾 伪代码 环...

  • Java面试题集四

    1、怎么判断环形链表 使用快慢指针:创建两个指针,同时指向这个链表的头节点,然后开始循环,指针1每次移动一个结点,...

  • 算法学习--双指针

    双指针分类 快慢指针 左右指针 快慢指针:主要解决链表相关问题,比如:典型的判断链表中是否包含环、链表倒是第K个节...

  • [链表]-141. 环形链表

    给定一个链表,判断链表中是否有环。 进阶:你能否不使用额外空间解决此题? 解析: 快慢指针的典型应用,设置两个指针...

网友评论

      本文标题:循环链表:快慢指针进阶:找入口

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