当前位置: 首页 > article >正文

力扣---LeetCode141/142. 环形链表 (I)和(II) (代码详解+流程图+数学逻辑拓展)

文章目录

  • 前言
  • 141. 环形链表 I
    • 1.1 链接:
    • 1.2 思路:
    • 1.3 代码:快慢指针
    • 1.4 流程图:
  • 142. 环形链表 II
    • 2.1 链接:
    • 2.2 思路:
    • 2.3 代码:
    • 2.4 流程图:
  • 拓展问题及证明(面试常问):
    • 3.1 slow和fast一定会相遇吗?(slow一步,fast两步)
      • 3.1.1答案:(每次缩小1)一定会相遇
      • 3.1.2证明:
    • 3.2 slow走1步,fast走n(3/4/5.…)步可以吗?(n > 2)
      • 3.2.1答案:不一定相遇
      • 3.2.2证明:
  • 总结


前言

“山前山后都有风景有风无风都很自由”
本章的内容是力扣每日随机一题的部分方法的代码解析以及流程图


提示:以下是本篇文章正文内容,下面案例可供参考

141. 环形链表 I

给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
在这里插入图片描述

1.1 链接:

141. 环形链表 I link

1.2 思路:

定义一个快指针(一次走两步)一个慢指针(一次走一步)转换成龟兔赛跑的问题,最终都会进环当快指针追上慢指针就证明有环,若没环就不会出现快指针追上慢指针的情况走到快指针为NULL就结束了

1.3 代码:快慢指针

bool hasCycle(struct ListNode *head)
{
    struct ListNode *fast=head;
    struct ListNode *slow=head;
    while(fast&&fast->next)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

1.4 流程图:

在这里插入图片描述

142. 环形链表 II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改链表。
在这里插入图片描述

2.1 链接:

142. 环形链表 II link

2.2 思路:

一个指针从相遇点走,一个指针从链表头开始走,他们会在入口点相遇.
特殊推论:
在这里插入图片描述
通用推论:
在这里插入图片描述

2.3 代码:

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

2.4 流程图:

在这里插入图片描述

拓展问题及证明(面试常问):

3.1 slow和fast一定会相遇吗?(slow一步,fast两步)

3.1.1答案:(每次缩小1)一定会相遇

3.1.2证明:

在这里插入图片描述

3.2 slow走1步,fast走n(3/4/5.…)步可以吗?(n > 2)

3.2.1答案:不一定相遇

3.2.2证明:

在这里插入图片描述


总结

Ending,今天的力扣每日一题内容就到此结束啦,如果后续想了解更多,就请关注我吧,一键三连,还有许多种方法没有写出希望各位佬补充哦~


http://www.kler.cn/a/17410.html

相关文章:

  • 植物明星大乱斗1
  • 金融学期末速成笔记
  • 构造函数原型对象语法、原型链、原型对象
  • 【GeoJSON在线编辑平台】(2)吸附+删除+挖孔+扩展
  • 简单介绍 Spring 中获取 Bean 的三种方式
  • ClickHouse创建分布式表
  • 自动驾驶技术:前景、优势与挑战
  • kubernetes安装
  • Docker 架构
  • Vue生命周期
  • 第二十四回:如何屏蔽事件
  • SpringMVC(后)SSM整合
  • [创新工具和方法论]-01- DOE课程基础知识
  • K8s 安全是云安全的未来
  • AI仿写软件-仿写文章生成器
  • 计算机组成原理4.2.3提高存储器访问速度的措施
  • 送了老弟一台 Linux 服务器,它又懵了!
  • Ae:橡皮擦工具
  • Redis缓存穿透和雪崩
  • 3 文件和目录
  • 归纳截图小结
  • innodb_flush_log_at_trx_commit 和 sync_binlog 参数解析
  • 数字中国建设峰会|大模型带来产业智能化新机遇
  • 【Linux0.11代码分析】03 之 setup.s 启动流程
  • C++——类和对象(3)
  • 初识 OPC