相遇于此,相交链表的解题心得

news2024/11/21 0:21:39

在这里插入图片描述

本篇博客会讲解力扣“160. 相交链表”的解题思路,这是题目链接。

老规矩,先来审题。这道题的题干有点长,简而言之,就是判断2个链表是否相交,如果相交就返回第一个相交结点,不相交就返回NULL。看看题目原文:
在这里插入图片描述
在这里插入图片描述
以下是几个示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下是提示和进阶要求:
在这里插入图片描述
接下来讲解我想到的最佳解题思路,如果有更好的思路,可以在评论区提出。

这道题本质上是2小问:

  1. 链表是否相交?
  2. 如果相交,请找出第一个相交结点。

对于第一个问题,判断方法其实很简单,如果尾结点相同,那么2个链表相交。

如果相交的话,如何找出第一个相交结点呢?我们可以在第一步找出尾结点的时候顺便统计2个链表的长度,并求出长度的差。接着让长链表先走差距步,2个链表再同时走,第一个相遇的结点就是我们要找的结点。

开始写代码:首先先找尾结点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    // 找尾结点
    while (tailA->next)
    {
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        tailB = tailB->next;
    }
}

如果尾结点不相同,则链表一定不相交。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    // 找尾结点
    while (tailA->next)
    {
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        tailB = tailB->next;
    }

    // 尾结点不同,链表不相交
    if (tailA != tailB)
    {
        return NULL;
    }
}

如果相交,就应该求出链表的第一个相交结点。我们得让长的链表先走差距步,所以应该先求出2个链表的长度,在前面找尾结点的同时就可以顺便求一下。注意为了严谨起见,lenA和lenB都被初始化成1,不然会少算一个结点。计算差距可以调用abs函数求绝对值。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    int lenA = 1, lenB = 1;
    // 找尾结点,顺便求长度
    while (tailA->next)
    {
        ++lenA;
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        ++lenB;
        tailB = tailB->next;
    }

    // 尾结点不同,链表不相交
    if (tailA != tailB)
    {
        return NULL;
    }

    // 长度差距,取差的绝对值
    int gap = abs(lenA - lenB);
}

接下来我们得知道这2个链表谁长谁短。方法很简单,先假设A长B短,如果不是这样,就修正一下。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    int lenA = 1, lenB = 1;
    // 找尾结点,顺便求长度
    while (tailA->next)
    {
        ++lenA;
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        ++lenB;
        tailB = tailB->next;
    }

    // 尾结点不同,链表不相交
    if (tailA != tailB)
    {
        return NULL;
    }

    // 长度差距,取差的绝对值
    int gap = abs(lenA - lenB);

    // 判断链表谁长谁短
    // 假设A长B短
    struct ListNode *longList = headA, *shortList = headB;
    // 不满足就修正
    if (lenA < lenB)
    {
        longList = headB;
        shortList = headA;
    }
}

接下来让长链表先走差距步:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    int lenA = 1, lenB = 1;
    // 找尾结点,顺便求长度
    while (tailA->next)
    {
        ++lenA;
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        ++lenB;
        tailB = tailB->next;
    }

    // 尾结点不同,链表不相交
    if (tailA != tailB)
    {
        return NULL;
    }

    // 长度差距,取差的绝对值
    int gap = abs(lenA - lenB);

    // 判断链表谁长谁短
    // 假设A长B短
    struct ListNode *longList = headA, *shortList = headB;
    // 不满足就修正
    if (lenA < lenB)
    {
        longList = headB;
        shortList = headA;
    }

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

2个链表同时走,直到相遇。相遇的结点就是第一个相交结点。

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *tailA = headA, *tailB = headB;
    int lenA = 1, lenB = 1;
    // 找尾结点,顺便求长度
    while (tailA->next)
    {
        ++lenA;
        tailA = tailA->next;
    }
    while (tailB->next)
    {
        ++lenB;
        tailB = tailB->next;
    }

    // 尾结点不同,链表不相交
    if (tailA != tailB)
    {
        return NULL;
    }

    // 长度差距,取差的绝对值
    int gap = abs(lenA - lenB);

    // 判断链表谁长谁短
    // 假设A长B短
    struct ListNode *longList = headA, *shortList = headB;
    // 不满足就修正
    if (lenA < lenB)
    {
        longList = headB;
        shortList = headA;
    }

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

    // 同时走,直到相遇
    while (longList != shortList)
    {
        longList = longList->next;
        shortList = shortList->next;
    }

    // 相遇点即为第一个交点
    return longList;
}

在这里插入图片描述
这样就通过了。

总结

相交链表问题的解题思路如下:

  1. 先找出尾结点,如果尾结点相同则相交,否则不相交。
  2. 找尾结点时顺便求出链表长度,计算出长度差距。
  3. 判断哪个链表长,哪个链表短的方法:先假设,如果不满足假设就修正。
  4. 让长链表先走差距步,再同时走,直到相遇,相遇点就是第一个交点。

感谢大家的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502025.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++中可调用对象和function】

C中有如下几种可调用对象&#xff1a;函数、函数指针、lambda表达式、bind对象、仿函数。其中&#xff0c;lambda表达式和bind对象是C11标准中提出的(bind机制并不是新标准中首次提出&#xff0c;而是对旧版本中bind1st和bind2st的合并)。个人认为五种可调用对象中&#xff0c;…

FM33A048B LPUART

概述 LPUART 是一个低功耗UART 接口&#xff0c;其工作仅需32768Hz 时钟&#xff0c;可以支持到最高9600 波特率的数据接收。LPUART 功耗极低&#xff0c;可以在Sleep/DeepSleep 模式下工作。 特点&#xff1a; ⚫ 异步数据收发 ⚫ 标准UART帧格式 ◼ 1bit起始位 ◼ 7或8bit数据…

【ChatGPT Prompt Engineering】面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

lua是什么?lua的基本语法知识点

目录 一、lua是什么&#xff1f; 二、lua的基本语法 1.运行lua脚本文件 2.注释 3.标示符 4.关键词 5.全局变量 三、数据类型 8个基本类型 1.nil(空&#xff09; 2.boolean&#xff08;布尔&#xff09; 3.number(数字&#xff09; 4.string(字符串&#xff09; 5…

一图看懂 six 模块:最常见的 POSIX 系统调用, 资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创&#xff0c;转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 six 模块&#xff1a;最常见的 POSIX 系统调用, 资料整理笔记&#xff08;大全&#xff09; 摘要模块图类关系图模块全展开【six】统计常量intboolstrtuplelist 模块24 fun…

电脑屏幕开机后一直闪不停怎么办?电脑屏幕闪烁的解决方法

不少电脑用户经常会遇到的一种情况&#xff0c;就是开机后&#xff0c;发现电脑屏幕一直闪不停&#xff0c;十分伤眼。驱动人生就为大家带来电脑屏幕闪烁的解决方法。 首先&#xff0c;驱动人生建议可以排查一下出现电脑屏幕闪烁的原因&#xff0c;从而更加针对性的解决故障。…

SpringBoot 整合第三方技术Junit+MyBatis+Druid

测试类中加两个注解就行 SpringBootTest(classes Application.class)//添加SpringBoot 的启动类&#xff0c;万无一失 RunWith(SpringJUnit4ClassRunner.class) public class SpringBootJunitTest {Testpublic void test(){System.out.println("ddddddddddddddddddd&quo…

四象限法则定量分析法,如何客观划分需求优先级?

四象限法按照重要和紧急程度&#xff0c;划分为4个象限&#xff1a;重要且紧急、重要不紧急、不重要但紧急、不重要不紧急。那么我们如何客观地对需求进行评估&#xff0c;并将其放到对应的象限&#xff1f; 我们可以使用定量分析方法对象限进行划分和定值。在横纵坐标中&#…

php+mysql求职招聘人才网站

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户[10]。 2&#xff0e;系统用户管理&#xff1a;不…

温湿度换算绝对含水量

常压下 公式如下 y z * ( 8.0141786694E-09*x^5 2.3071566385E-06*x^4 1.3157923494E-04*x^3 1.1376256438E-02*x^2 3.1867343275E-01*x 4.9021104226E00 ) 式子中 z 相对湿度 单位百分比 x 摄氏度 单位度 取值范围 5-100度 y 绝对湿度 单位 克每立方…

OSPF原理—详细!!

OSPF&#xff08;open shortest path first&#xff09;&#xff1a;开放式最短路径优先 定义&#xff1a;是基于链路状态算法的路由协议 为什么要用OSPF&#xff1f; 网络发生变化&#xff0c;静态路由需要手动配置&#xff0c;太麻烦无法响应网络变化&#xff0c;需要手动更…

鸟哥的Linux私房菜——基础学习篇(第三版) (11-17章)

基础学习篇 第十一章 &#xff1a;认识和学习bash第十二章 &#xff1a;正则表达式与文件格式化处理第十三章 &#xff1a;学习shell script第十四章 &#xff1a;Linux账号管理与ACL权限设定第十五章 &#xff1a;磁盘配额(Quota)与进阶文件系统管理第十六章 &#xff1a;例行…

C++List类详解

目录 1.List介绍 2.List的常见使用 2.1 list的构造函数 2.2 list iterator的使用 2.3 list capacity 2.4 list element access 2.5 list modifiers 2.6 list的迭代器失效 3.List的模拟实现 3.1 list模拟实现&#xff08;可跳过&#xff09; 3.2 反向迭代器实现 3.2.1 list反…

100天精通Python(可视化篇)——第86天:matplotlib绘制不同种类炫酷热力图参数说明+代码实战

文章目录 专栏导读一、热力图介绍1. 介绍2. 参数说明 二、绘制热力图1. 普通热力图2. 添加坐标轴和标题3. 添加热力标尺4. 添加色块数值5. 修改热力图颜色6. 突出特殊数据 三、应用场景1. 适用场景2. 不适用场景 专栏导读 &#x1f525;&#x1f525;本文已收录于《100天精通P…

如何提高亚马逊卖家订单量?这些建议和技巧值得收藏

作为全球最大的电商平台之一&#xff0c;亚马逊拥有庞大的客户基础和丰富的销售渠道&#xff0c;这对于亚马逊卖家来说是一个非常宝贵的机会。但是&#xff0c;如何提高亚马逊卖家订单量是一个非常重要的问题。在本文中&#xff0c;我将分享一些提高亚马逊卖家订单量的建议和技…

【软考备战·希赛网每日一练】2023年5月8日

文章目录 一、今日成绩二、错题总结第一题第二题 三、知识查缺 题目及解析来源&#xff1a;2023年05月08日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; 题目中存在一个 指向链表尾元素的指针&#xff0c;所以插入操作直接通过该指针进行后续操作即…

MySQL数据库用户管理以及数据库用户授权

一、数据库用户管理 1、新建用户 CREATE USER 用户名来源地址 [IDENTIFIED BY [PASSWORD] 密码]; ---------------------------------------------------------------------------------------------------------- 用户名&#xff1a;指定将创建的用户名 来源地址&#xff1a…

Mysql数据库管理高级操作

目录 一、克隆/复制一个表1.1 方法一1.2 方法二 二、清空表&#xff0c;删除表内所有数据2.1 方法一2.2 方法二2.3 drop、truncate、delete对比①.drop table name②.truncate table table_name③.delete from table_name小结&#xff1a; 三、创建临时的表四、用户管理4.1 新建…

Java每日一练(20230508) Excel表列名称、验证回文串、路径总和II

目录 1. Excel表列名称 &#x1f31f; 2. 验证回文串 &#x1f31f; 3. 路径总和 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. Excel表列名称 给…

启动Rabbit时出现Plugin configuration unchanged无法启动问题

文章目录 问题描述问题解决新问题 问题描述 在安装好Erlang和RabbitMQ并配置好环境变量后, 运行rabbitmq-plugins enable rabbitmq_management 命令, 出现如下问题 在启动Rabbit时出现以下内容 The folwing plugins have been configured: rabbitmq_management rabbitmq_mana…