【力扣每日一题】2023.7.30 环形链表2

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

题目:

【力扣每日一题】2023.7.30 环形链表2,力扣每日一题,leetcode,链表,算法,数据结构,c++

示例:

【力扣每日一题】2023.7.30 环形链表2,力扣每日一题,leetcode,链表,算法,数据结构,c++

分析:

这道题属于是那种知道解法就很简单,不知道解法就很难独立想出来的那种,我们只需要稍微记住这类题的固定解法就可以。

所以接下来我先说解法,再解释为什么解法可以解出来。

那么我们都知道使用快慢指针可以找出一个链表是否有环(不知道的去看看我昨天的每日一题题解),我们需要找出这个环的路口,我们在快慢指针相遇的时候就可以判断出链表有环,并且开始寻找。

我们将快指针移动回链表的开头,并且将快指针的速度调整为每次移动一格,然后再让快慢指针再次移动,直到它们相遇,相遇的位置就是环的入口。

这看起来有些不可思议是吗,怎么会这么简单,而且怎么就可以知道它们再次相遇的点就是环入口了,小朋友你是否有很多问号???

那么这涉及到了数学,因此这类题我的建议就是记住对应的模板,不要深究怎么样才可以在下次遇到类似的题目时自己可以从零开始推导出来,这不是普通人能干的

首先我们把链表开头到环入口的这段距离称为A,把环入口到快慢指针第一次相遇的地方的这段距离称为B,把快慢指针第一次相遇的地方直走走回环的入口的这段距离称为C,接下来可以开始推导了。

【力扣每日一题】2023.7.30 环形链表2,力扣每日一题,leetcode,链表,算法,数据结构,c++

我们知道,快指针走过的的路程等于A+B+C+B,而慢指针走过的路程等于A+B。

我们又知道,每次快指针移动两格,慢指针移动一格,因此快指针走过的路程是慢指针的两倍。

我们就可以得到这样的式子:

A+B+C+B = 2*(A+B) = A+A+B+B

 化简一下就变成了:

C=A

 神奇吗同志们,从链表到环入口的距离(A)就等于在快慢指针第一次相遇的地方再次走到环入口,因此我们之前的操作就可以得到解释了,让慢指针接着走,然后让快指针调整速度以后从头开始走,走到它们第二次相遇,那就是环的入口了。

【力扣每日一题】2023.7.30 环形链表2,力扣每日一题,leetcode,链表,算法,数据结构,c++文章来源地址https://www.toymoban.com/news/detail-622604.html

代码:

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        if(head==nullptr) return nullptr;
        //快慢指针
        ListNode* fast=head;
        ListNode* slow=head;

        while(fast!=nullptr && fast->next!=nullptr){
            //快指针每次移动两次,慢指针每次移动一次
            slow=slow->next;
            fast=fast->next->next;
            //如果相遇则是有环,开始寻找入口
            if(fast==slow){
                fast=head;
                while(fast!=slow){
                    fast=fast->next;
                    slow=slow->next;
                }
                return fast;
            }
        }
        return nullptr;
    }
};

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

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

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

相关文章

  • 2023-07-31 LeetCode每日一题(重排链表)

    点击跳转到题目位置 给定一个单链表 L 的头节点 head ,单链表 L 表示为: 请将其重新排列后变为: 不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 示例 2: 提示: 链表的长度范围为 [1, 5 * 10 4 ] 1 = node.val = 1000 (1) 使用 分治 的思路来解决问题。

    2024年02月14日
    浏览(47)
  • 2023-08-12 LeetCode每日一题(合并 K 个升序链表)

    点击跳转到题目位置 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 示例 2: 示例 3:

    2024年02月13日
    浏览(41)
  • 2023-08-06 LeetCode每日一题(24. 两两交换链表中的节点)

    点击跳转到题目位置 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1: 示例2: 示例3: 提示: 链表中节点的数目在范围 [0, 100] 内 0 = Node.val = 100 (1) 使用递归解决问题

    2024年02月14日
    浏览(46)
  • C语言每日一题:13《数据结构》环形链表。

    题目链接: 使用快慢指针利用相对移动的思想: 1,令快指针(fast)速度为2. 2.慢指针(slow)速度为1. 3.以慢指针进入环中开始。 4。假设slow刚刚进入环中fast与它相距N。 如图所示: 1,令快指针(fast)速度为3.M 2.慢指针(slow)速度为1. 3.以慢指针进入环中开始。 4。假设slow刚

    2024年02月14日
    浏览(46)
  • 力扣每日一题86:分隔链表

    给你一个链表的头节点  head  和一个特定值   x  ,请你对链表进行分隔,使得所有  小于   x  的节点都出现在  大于或等于   x  的节点之前。 你应当  保留  两个分区中每个节点的初始相对位置。 示例 1: 示例 2: 提示: 链表中节点的数目在范围  [0, 200]  内 -100 = N

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

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

    2024年02月19日
    浏览(34)
  • (链表) 143. 重排链表 ——【Leetcode每日一题】

    难度:中等 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L 0 L_0 L 0 ​ → L 1 L_1 L 1 ​ → … → L n − 1 L_{n-1} L n − 1 ​ → L n L_n L n ​ 请将其重新排列后变为: L 0 L_0 L 0 ​ → L n L_n L n ​ → L 1 L_1 L 1 ​ → L n − 1 L_{n-1} L n − 1 ​ → L 2 L_2 L 2 ​ → L n − 2 L_{n-2} L n −

    2024年02月08日
    浏览(48)
  • 2023-08-09力扣每日一题

    链接: 1281. 整数的各位积和之差 题意: 十进制每一位的积减去每一位的和 解: 十进制位处理 实际代码: 限制: 1 = n = 10^5

    2024年02月13日
    浏览(45)
  • 2023-09-07力扣每日一题

    链接: [2594. 修车的最少时间](https://leetcode.cn/problems/form-smallest-number-from-two-digit-arrays/) 题意: 一个能力R的人R*N*N分钟修N辆车,求最快多久修完(多人多车) 解: 二分很好想,主要是怎么检查(数学废物润去看题解了) 实际代码: 限制: 1 = ranks.length = 105 1 = ranks[i] = 100 1 = ca

    2024年02月09日
    浏览(39)
  • 2023-08-15力扣每日一题

    链接: 833. 字符串中的查找与替换 题意: n组操作,其中第i组: 检查 子字符串 sources[i] 是否出现在 原字符串 s 的索引 indices[i] 处。 如果没有出现, 什么也不做 。 如果出现,则用 targets[i] 替换 该子字符串。 所有替换操作必须 同时 发生,这意味着替换操作不应该影响彼此

    2024年02月12日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包