面试题 02.08. 环路检测

程序员面试金典 专栏收录该内容
49 篇文章 0 订阅

LeetCode CXY: 面试题 02.08. 环路检测

在这里插入图片描述


前不久做过一题一样的 >> 称为 浪漫的相遇 >> ((( 对的人终究会相遇

快慢双指针 >> 判断是否成环 >> 共有两次相遇
解决步骤

第一次相遇: 循环遍历 >> 每次 slow 走一步, fast 走两步 >> 直到 slow == fast >> 除非 fast 为 null 了 或者 fast.next 为 null

slow、fast双指针 保持他们相遇时的位置不动
slow 回到 listNode 起点 >> slow = head;

第二次相遇: 继续循环 >> 每次 slow 走一步,fast 也走一步 >> 最终 slow 和 fast 终究会在成环的起点 相遇



快慢双指针


    public ListNode detectCycle(ListNode head) {
        if(head == null || head.next == null) return null;
        ListNode slow = head.next, fast = head.next.next;

        while (true){
            // 没有环
            if(fast == null || fast.next == null) return null;
            // 第一次相遇
            if(slow == fast) break ;
            slow = slow.next;
            fast = fast.next.next;
        }

        // 回初始位置
        slow = head;
        // head 就是起点的情况
        //if(slow == fast) return slow;
        // 到这里说明是有环了
        while (true){
            if(slow == fast){
                return slow;
            }
            slow = slow.next;
            fast = fast.next;
        }
    }



在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值