【leetcode】141.环形链表

这篇具有很好参考价值的文章主要介绍了【leetcode】141.环形链表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【leetcode】141.环形链表,实例,leetcode,链表,算法

【leetcode】141.环形链表,实例,leetcode,链表,算法 【leetcode】141.环形链表,实例,leetcode,链表,算法

分析:使用快慢指针,快指针一次走两步,慢指针一次走一步

快指针在环内追赶慢指针,如果两个指针相遇,则证明存在环

证明:

1️⃣环的起点为链表的尾节点,当fast指针到达环的起点时,slow指针走到链表的一半

【leetcode】141.环形链表,实例,leetcode,链表,算法2️⃣当slow指针到达环的起点时,fast指针指向环内的某个节点

【leetcode】141.环形链表,实例,leetcode,链表,算法

3️⃣此时快慢指针的差距为N,fast指针一次走两步,slow指针一次走一步,两个指针的差距每次缩小1,N次之后,两个指针的差距缩小为0,即两指针相遇

bool hasCycle(struct ListNode *head) {
    struct ListNode* slow, *fast;
    slow = fast = head;

    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        //快指针赶上了慢指针,存在环
        if(fast == slow)
        {
            return true;
        }
    }

    return false;
}


【leetcode】141.环形链表,实例,leetcode,链表,算法

【leetcode】141.环形链表,实例,leetcode,链表,算法

【leetcode】141.环形链表,实例,leetcode,链表,算法

方法一:

首先要判断链表是否有环,非环形链表返回NULL,环形链表才有下述操作

【leetcode】141.环形链表,实例,leetcode,链表,算法由上图:

fast指针每次走两步,slow指针每次走一步,所以有2(L+x) = L+x+N*C

L = N*C - x = (N-1)*C + C - x

如果有一个指针从头开始走,当它走过L到达环的入口时,有一个指针从相遇点meet走,他绕环N-1圈,再走C-x,同时也到达环的入口

所以我们使用两个指针,一个head链表头开始走,一个meet从相遇点开始走,每次走一步,当这两个指针不等时,head = head->next,meet = meet->next;当这两个指针相等时,即为环的入口节点

struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode* slow, *fast;
    slow = fast = head;
    struct ListNode* tail = head;
    

    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        //存在环,返回入环的第一个节点
        if (fast == slow)
        {
            //找到相遇点
            struct ListNode* meet = slow;
            while(meet != head)
            {
                meet = meet->next;
                head = head->next;
            }
            //相遇即为环的入口
            return meet;

        }
    }

    return NULL;    
}

方法二:转换成相交链表问题 

我们已经很熟练的可以找到环中fast指针和slow指针的相遇点

【leetcode】141.环形链表,实例,leetcode,链表,算法

由上图,我们可以将环形链表分成两部分

 一个以head作为头,meet作为尾

另一个以meet->next作为头,meet作为尾

环的入口是这两个链表相交的位置,已经讲述过链表相交问题【leetcode】160.相交链表_李斯啦果的博客-CSDN博客

因此求环的入口即转换成求两个链表相交位置的问题

📖Note

断开链表会更改原链表,因此求出交点后需要恢复原链表的结构

//方法二:转换成相交链表问题
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
    struct ListNode* curA = headA;
    struct ListNode* curB = headB;
    int lenA = 0;
    int lenB = 0;

    //统计长度    
    while (curA)
    {
        lenA++;
        curA = curA->next;
    }
    while (curB)
    {
        lenB++;
        curB = curB->next;
    }

    struct ListNode* longList = headA, * shortList = headB;
    if (lenA < lenB)
    {
        longList = headB;
        shortList = headA;
    }
    int gap = abs(lenA - lenB);

    //长链表先走差距步
    while (gap--)
    {
        longList = longList->next;
    }

    //同时走
    while (longList != shortList)
    {
        longList = longList->next;
        shortList = shortList->next;

    }

    return longList;

}
struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* slow, *fast;
    slow = fast = head;
    struct ListNode* tail = head;
    
    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        //存在环,返回入环的第一个节点
        if (fast == slow)
        {
            //转换成相交链表问题
            struct ListNode* next = slow->next;
            //断开环
            slow->next = NULL;

            struct ListNode* entryNode = getIntersectionNode(head,next);
            //恢复环
            slow->next = next;
            return entryNode;

        }
    }

    return NULL;    
}

 文章来源地址https://www.toymoban.com/news/detail-628886.html

到了这里,关于【leetcode】141.环形链表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单链表OJ题:LeetCode--141.环形链表

    朋友们、伙计们,我们又见面了,本期来给大家解读一下LeetCode中的第141道单链表OJ题,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页  :stackY、 C 语 言 专 栏 :C语言:从入门到精通 LeetC

    2024年02月08日
    浏览(53)
  • LeetCode[141] [142] 环形链表I II

    141. 环形链表 - 力扣(LeetCode) 142. 环形链表 II - 力扣(LeetCode) 题解: 快慢指针题 从head开始,一个快指针,一次前进两步,一个慢指针,一次走一步 如果没有环,则快指针首先到达链表尾部, 如果有环,快慢指针肯定能相遇即fast=slow 141代码: 对于142需要环的起点,需要

    2024年02月04日
    浏览(46)
  • leetcode 141.环形链表 I - 142.环形链表 II 代码及指针相遇证明问题

    给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 如果链表中存在环 ,则返回 true 。 否则,返回 false 。 思路: 快慢指针问题 。我们可以声明一个 fast 指针(一次走两步),声明一个 slow

    2024年02月12日
    浏览(63)
  • [LeetCode]-160. 相交链表-141. 环形链表-142.环形链表II-138.随机链表的复制

    目录 160.相交链表  题目 思路 代码  141.环形链表  题目 思路 代码 142.环形链表II 题目 思路 代码 160. 相交链表 - 力扣(LeetCode) https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 给你两个单链表的头节点  headA  和  headB  ,请你找出并返回两个单链表相交的起始节点

    2024年02月05日
    浏览(50)
  • 算法详解(力扣141——环形链表系列)

    博主ID:代码小豪 先来看看环形链表的原题: 中间的部分叙述有点繁杂,简单来概括就是,假如有一个节点,如果一直调用该节点的next,最后会回到该节点,那么这个链表就是带环的。 环形链表的性质分析 假如有个cur指针从头开始遍历链表,如果这个链表不是环形链表,那

    2024年02月19日
    浏览(34)
  • 【每日OJ题—— 141. 环形链表(链表)】

    2.1 解法 2.1.1 图文解析 我们可以根据上述思路来解决本题。具体地,我们定义两个指针,一快一慢。慢指针每次只移动一步,而快指针每次移动两步。初始时,慢指针在位置 head,而快指针在位置 head.next。这样一来,如果在移动的过程中,快指针反过来追上慢指针,就说明该

    2024年02月05日
    浏览(46)
  • 链表专题1—24. 两两交换链表中的节点 234.回文链表 143.重排链表 141.环形链表 142.环形链表II 160.链表相交 C++实现

    迭代法,时间复杂度: O ( n ) O(n) O ( n ) , 空间复杂度: O ( 1 ) O(1) O ( 1 ) 时间复杂度、空间复杂度: O ( n ) O(n) O ( n ) 止位置时,慢指针就在链表中间位置。 同时用pre记录慢指针指向节点的前一个节点,用来分割链表,将链表分为前后均等两部分,如果链表长度是奇数,那么

    2024年02月12日
    浏览(43)
  • 【LeetCode 算法】Linked List Cycle II 环形链表 II

    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从

    2024年02月14日
    浏览(43)
  • LeetCode | 一探环形链表的奥秘【快慢双指针妙解BAT等大厂经典算法题】

    前言 本文总结了力扣141.环形链表|以及142.环形链表||这两道有关环形链表的求解方案,去求证链表是否带环已经如何找出入环口的结点。 有关环形链表,在BAT等大厂面试中均有出现,一般是属于 中等难度 的题,需掌握 原题传送门 给你一个链表的头节点 head ,判断链表中是

    2024年02月01日
    浏览(43)
  • 环形链表、环形链表 II、有效的括号​​​​​​​(leetcode)

    目录 一、环形链表 方法(快慢指针): 二、环形链表 II 三、有效的括号 给你一个链表的头节点  head  ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪  next  指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数  pos  来

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包