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题解:141.环形链表 142.环形链表 II -> 正文阅读

[数据结构与算法]LeetCode题解:141.环形链表 142.环形链表 II

怀着兴趣探索编程的世界,如此,美妙?

141.环形链表

141.环形链表
如何判断链表是否带环呢?可采用快慢指针法
快指针一次走二步,慢指针一次走一步,如果它们最终相遇,说明链表带环,否则不带环。
为什么这个可以判断呢?结论:如果链表带环,fast一定可以追上slow。
在这里插入图片描述
假设slow进环后,fast跟slow的距离是N
这时fast真正开始追击slow,fast一次走2步,slow一次走1步,它们之间的距离每次缩小1
N
N-1
N-2

2
1
0(追上相遇了)

如果快指针一次走3步,慢指针一次走1步,slow进环后,它们的距离每次缩小2,即使链表带环,也不一定能追上
在这里插入图片描述
错开后,它们的距离变成C-1(C是环的长度),如果C-1是偶数,则可以追上,如果C-1是奇数,则永远追不上。
代码部分:

bool hasCycle(struct ListNode *head) {
    struct ListNode*slow,*fast;
    fast = slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;

        if(fast == slow)
        {
            return true;
        }
    }

    return false;
}

142.环形链表 II

142.环形链表 II
如果链表带环,如何找到链表开始入环的第一个结点呢?
结论:一个指针从头结点开始一次走1步,一个指针从相遇点(快指针和慢指针都从头开始,快指针一次走二步,慢指针一次走一步,fast和slow相遇的点)开始一次走1步,它们两相遇的点即是链表开始入环的第一个结点。
证明:
在这里插入图片描述
slow在进环以后,fast在2圈之内,一定追上slow!
为什么?追击的过程每次缩小1,不可能错过,它们的相对距离是1圈,slow最多走1圈,fast最多走2圈

假设slow在进环前,fast在环里面转了N圈(N>=1),因为环可能很大,也可能很小。
slow 走的距离:L+X
fast 走的距离:L + NC +X
又因为fast是slow的2倍,则,2
(L+X) = L + N*C +X,化简后得,L = (N-1)*C + C - X;证毕!。

代码部分:

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode*fast,*slow;
    fast = slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;

        if(fast == slow)
        {
            struct ListNode* meet = slow;
            while(head!=meet)
            {
               head = head->next;
               meet = meet->next;
            }

            return head;
        }
    }
    return NULL;
}

如果对您有所帮助,期待您的点赞和关注呀😍!

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

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