ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LK141142-环形链表

2021-05-31 22:05:12  阅读:174  来源: 互联网

标签:head slow LK141142 环形 fast next 链表 meet


LK141-环形链表

https://leetcode-cn.com/problems/linked-list-cycle/description/

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode*slow=head,*fast=head;
        while(fast&&fast->next){
            slow=slow->next;
            fast=fast->next->next;
            if(slow==fast){
                return true;
            }
        }
        return false;
    }
};

 

LK142-环形链表2

https://leetcode-cn.com/problems/linked-list-cycle-ii/description/

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode*slow=head,*fast=head;
        while(fast&&fast->next){
            slow=slow->next;
            fast=fast->next->next;
            //slow==fast说明fast追上了slow证明链表有环
            if(slow==fast){
                //meet为slow和fast的相遇点
                ListNode*meet=fast;
                while(head!=meet){
                    head=head->next;
                    meet=meet->next;
                }
                return meet;//此时meet为入环的第一个节点
            }
        }
        //fast==nullptr||fast->next==nullptr说明链表不带环
        return nullptr;
    }
};

1.判断链表是否带环?

-快慢指针-slow一次走一步,fast一次走两步,如果链表有环,fast一定会在环内追上slow

 

2.证明slow一次走一步,fast一次走两步,fast一定能追上?

假设slow刚入环和fast距离为N

slow一次走一步,fast一次走两步,每各走一步,slow和fast之间的距离减小1

N-1

N-2

...

N-N=0

最后一定会减到0

 

3.如果slow一次走一步,fast一次走3步呢?fast一次走4步呢?

如果fast一次走3步,那么每各走一步,slow和fast之间的距离减小2

N-2

N-4

...

如果N为奇数,最后相减N为-1

极端情况下,N每次都为奇数,那么slow和fast永远不会相遇

如果fast一次走4步,那么每各走一步,slow和fast之间的距离减小3

N-3

N-6

N-9

...

极端情况下,N每次都刚好错开,那么slow和fast永远不会相遇

 

4.若带环,求出环的长度?-从相遇点再走一圈

 

5.若带环,求出环的入口点?

head-头节点

entry-环的入口点

meet-slow和fast的相遇点

假设

head->entry:L

环:C

entry->meet:X

因为slow走一步,fast走两步,所以到相遇时fast走的距离是slow的2倍

2(L+X)=L+NC+X

L+X=NC

L=NC-X

所以head和meet同时走,会在entry相遇

标签:head,slow,LK141142,环形,fast,next,链表,meet
来源: https://blog.csdn.net/A240428037/article/details/117430837

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有