IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> leetcode 142. 环形链表 II(双指针) -> 正文阅读

[数据结构与算法]leetcode 142. 环形链表 II(双指针)

题意

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
在这里插入图片描述

解题思路

① 设双指针 f a s t fast fast s l o w slow slow ,其中 f a s t fast fast 每次前进2步、 s l o w slow slow每次前进1步。如果 f a s t fast fast 最终为NULL,那么该链表无环;反之, f a s t fast fast s l o w slow slow必会在某一点相遇。
② 设 f a s t fast fast s l o w slow slow相遇的点为 P P P,那么 s l o w slow slow P P P点开始, f a s t fast fast从起始点,两个指针同时每次都前进一步,那两者最终相遇的地方即链表入环的第一个节点。

代码

/**
 * 给定一个链表,如果有环路,找出环路的开始点。
 *
 * @author ZhangLingRan
 */

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
        next = null;
    }
}

/**
 * @author ZhangLingRan
 */
public class Solution{

    public ListNode detectCycle(ListNode head) {

        ListNode fast = head, slow = head;
        
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow) {
                break;
            }
        }

        // 如果fast走到头,说明没环,那么返回NULL
        if (fast == null || fast.next == null) {
            return null;
        }

        //如果有环,那么找到第一次相遇的交点,slow从交点往后走、fast从head往后走,直到相遇即为交点
        fast = head;
        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }

        return fast;
    }
}

方法证明

在这里插入图片描述
假设这是一个带有环的链表;其中 O Q OQ OQ的长度为 L 1 L1 L1,环的长度为 L 2 L2 L2;两个指针在 P P P点相遇,那么当指针 s l o w slow slow走到了 P P P点,其走过的路程为 ∣ O P ∣ = L 1 + ∣ Q P ∣ |OP| = L1+|QP| OP=L1+QP,那么 f a s t fast fast指针走过的路程为 2 ∣ O P ∣ = L 1 + L 2 + ∣ Q P ∣ 2|OP| = L1+L2+|QP| 2OP=L1+L2+QP
由此可知:
2 ∣ O P ∣ = L 1 + L 2 + ∣ Q P ∣ = 2 ( L 1 + ∣ Q P ∣ ) 2|OP| = L1+L2+|QP| = 2(L1+|QP|) 2OP=L1+L2+QP=2(L1+QP)
化简得
L 2 ? ∣ Q P ∣ = L 1 , 即 ∣ P Q ∣ = L 1 L2-|QP| = L1,即|PQ| = L1 L2?QP=L1PQ=L1
其中 ∣ Q P ∣ |QP| QP表示从 Q Q Q点到 P P P点走过的路程, ∣ P Q ∣ |PQ| PQ表示从 P P P点到 Q Q Q的走过的路程。
∣ P Q ∣ = L 1 |PQ| = L1 PQ=L1可知,从 P P P点和 O O O点同时开始,每次前进一步,相遇点即链表的入环点。

-------------------我是分界线-----------------------
代码更新:

public ListNode detectCycle(ListNode head) {

        ListNode fast = head, slow = head;

        // 如果fast走到头,说明没环,那么返回NULL
        do{
            if (fast == null || fast.next == null) {
                return null;
            }
            fast = fast.next.next;
            slow = slow.next;
        }while (fast != slow);

        //如果有环,那么找到第一次相遇的交点,slow从交点往后走、fast从head往后走,直到相遇即为交点
        fast = head;

        while (fast != slow) {
            fast = fast.next;
            slow = slow.next;
        }

        return fast;
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-16 19:53:24  更:2021-10-16 19:54:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:45:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码