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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 使用java判断环形链表的起点,Leetcode 142题 -> 正文阅读

[数据结构与算法]使用java判断环形链表的起点,Leetcode 142题

判断环形链表的起点(java语言)Leetcode 142题

Leetcode 142题 判断环形链表的起点

在这里插入图片描述

在这里我们是使用快慢指针 (双指针) 的方式来解决此问题。

? 我们设置一个慢指针指向头结点,快指针指向头结点,快指针每次走两步,慢指针每次走一步。如果不存在环,快指针最终会指向null;如果存在环,两者最终必定在环中的某一点相遇。这是一个数学中的追击问题,两个运动员在环形跑道上匀速跑步,一个快,一个慢,慢的一方一定会被快的一方在一定时间内追上。(题外话,该论证是一个小学问题,但是我还是思考了很久,只能说智商多少沾点),所以我们得到如何判断链表中是否存在环的条件,即快慢指针最终相遇。

? 有了判断是否存在环的条件,接下来我们在来探讨一个问题,那就是如何找到链表中环的起点。我们假设:

将带环链表拆分成一个单链和一个环,结构如下图:

在这里插入图片描述

? 单链的长度为a,环的长度为c,两者在环中的c点相遇,注意,这个c点是距离环的起点的单圈距离。

? 设慢指针走的路程为s,快指针走的路程是f,这里是路程,不是距离或者是位移。快指针在环上走了m圈,慢指针在环上走了n圈,所以我们能够得出:

s = a + n * b + c

f = a + m * b + c

? 同时,因为快指针每次走两步,慢指针每次走一步,两者最终相遇,那么我们可以得出: f = 2 s;

所以我们能够得出 :a + m * b + c = 2 * ( a + n * b + c)

? 化简得 :a + c = (m - 2n) * b

? 即 :a + c 是 b 的整数倍,即我们从c点出发,走a步会到达环头,可能走了很多圈。

所以我们在两个快慢指针第一次相遇的时候,将慢指针再次指向头结点,快指针指向相遇的结点,两者以同样的速度(一步)前进,直至相遇,则环的起点找到。

以下是代码:java版本

  public ListNode detectCycle(ListNode head) {
    ListNode slow = head;
    ListNode fast = head;
    //证明有环的方法(当然我们也可以不使用快慢指针判断是否存在环)

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

    //head为空或者head只有一个结点的情况

    if (fast == null || fast.next == null) {
        // fast 遇到空指针说明没有环
        return null;
    }
    // 慢指针重新指向头结点
    slow = head;
    // 快慢指针以相同的速率前进,直到相遇
    while (slow != fast) {
        fast = fast.next;
        slow = slow.next;
    }
    return slow;
}

本人刷题心得,如有错误和冒犯,欢迎指正。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:01:52  更:2022-04-26 12:05:19 
 
开发: 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 7:25:07-

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