【链表OJ 10】环形链表Ⅱ(求入环节点)

简介: 【链表OJ 10】环形链表Ⅱ(求入环节点)

前言:

💥🎈个人主页:Dream_Chaser~ 🎈💥

✨✨刷题专栏:http://t.csdn.cn/UlvTc

⛳⛳本篇内容:力扣上链表OJ题目


leetcode142. 环形链表 II


来源: 142. 环形链表 II - 力扣(LeetCode)


1.问题描述

       给定一个链表的头节点  head ,返回链表开始入环的第一个节点如果链表无环,则返回 null

ef3348a62c6440b391e1a24d8041b70f.png


题解接口:

struct ListNode *detectCycle(struct ListNode *head) {
}


2.代码思路

前提条件:

是fast走的路程是slow的2倍。


解题思路:

       第一步,先定义一个快指针fast以及一个慢指针slow,这里跟环形链表1的快慢指针的操作一致,不作详细说明。之后找到可以证明链表带环的相遇点,并定义meet指针指向slow或此时的fast。

4d1231d665b047e090dc9e0259e95faf.png

第二步:接着让head指针从链表第一个节点开始移动,meet指针从相遇点开始移动,然后它们将会在链表带环的入口处相遇。(这是这道题思考的方向,但是如何去证明呢?)

7c2b34b9b6544b29a86d22d7bfbb0b74.png

代码实现:

struct ListNode *detectCycle(struct ListNode *head) {
   struct ListNode* fast=head,*slow=head;
   while(fast&&fast->next)
   {
       slow=slow->next;
       fast=fast->next->next;
    //带环(如果条件成立,则证明该链表为带环链表)
    if(slow == fast) 
    {
    struct ListNode*meet=slow;  
    //求入环点 
    while(head!=meet)
    {
        head=head->next;
        meet=meet->next;
    }
        return meet;//返回链表开始入环的第一个节点
    }
    }
    return NULL;//如果链表无环,则返回 null
}

代码执行:

36e6109ff2a94802a8563101376c31f0.png


3.问题分析

结论证明:

       一个指针从相遇点(meet)走,一个指针从链表头(head)开始走,他们会在入口点(返回值)相遇。为什么?以下是证明:


假设:

链表头--环入口点距离:L

环入口点--相遇点距离:X

环的长度:C

依据题意求出slow指针所走过的距离,明显是L+X

36f5c267bce34920a2e19813f6abc51d.png

然后思考一个问题:有没有可能slow进环转了几圈才追上?

       答:不可能! 1圈之内,fast必然追上slow,因为他们之间距离每次缩小1,不会错过,slow走1圈,fast都走了2圈了,肯定追上了。

 所以说可以简单的求出fast指针在环上走过的距离:L+C +X ,并且根据

       2*(L+X) = L+C+X

       L+X = C

       第一种情况:L=C-X -->可以求出链表头到环入口点距离

9978de55b2894ecf8ed483428ff7e7b4.png

  试想一下,当L的距离越长,环的大小越小,那么L=C-X依旧成立吗?

3f92018b48ba44198e6928c75e37bba6.png

由图可得, 可得到第二个结论:L=(n-1)*C+C-X   (n-1)*C表示fast在环内转了(n-1)

       总结:无论是第一种情况,还是第二种情况,meet与head均会在入环处相遇。


 本篇到此结束,感谢你的来访与支持,如有错误,十分欢迎指正。

相关文章
|
13天前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
21 7
|
17天前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
21 0
|
3月前
【数据结构OJ题】环形链表
力扣题目——环形链表
36 3
【数据结构OJ题】环形链表
|
3月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
50 1
【数据结构OJ题】复制带随机指针的链表
|
3月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
28 1
【数据结构OJ题】环形链表II
|
3月前
【数据结构OJ题】相交链表
力扣题目——相交链表
31 1
【数据结构OJ题】相交链表
|
3月前
【数据结构OJ题】链表分割
牛客题目——链表分割
28 0
【数据结构OJ题】链表分割
|
3月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
34 0
【数据结构OJ题】链表的回文结构
|
4月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
4月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表