每日一题---OJ题: 相交链表

片头

嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go!  !  !

emmm,看这道题好像不怎么难,我们一起画图分析分析 

上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交

怎么做这道题呢? 第一种思路就是暴力穷举,也是一种比较容易想到的办法

思路一: 让A链表的每一个结点依次跟B链表中的结点进行比较,如果有相等就是相交,第一个相等就是交点。

代码如下:

 typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
        ListNode* pA = headA;   //定义一个指向A链表的指针
        ListNode* pB = headB;   //定义一个指向B链表的指针

        //让A链表的每一个结点依次和B链表中的结点进行比较
        for(pA = headA; pA != NULL; pA = pA->next){
            for(pB = headB; pB != NULL; pB = pB->next){
                if(pA == pB){   //如果有相等就是相交
                    return pA;  //第一个相等就是交点
                }
            }
        }
        return NULL;            //如果没有相交,返回NULL
} 

我们把代码放到leetcode上面,显示通过

那还没有另外一种思路呢? 肯定有,且听我慢慢道来~

思路二:  1. 判断是否相交先找尾结点,尾结点的地址相同就相交; 2.找交点 长的链表先走长度差,再同时走找交点(第一个地址相同的就是交点)。

判断是否相交的代码如下:(因为后面我们需要知道长度差,因此在寻找尾结点的同时就计算链表的长度,效率更高)

        ListNode* pA = headA;       //定义pA指针,指向A链表的头结点
        ListNode* pB = headB;       //定义pB指针,指向B链表的头结点

        int lenA = 0;               //A链表的长度
        while(pA->next != NULL)     //寻找A链表的尾结点
        {
            pA = pA->next;          //如果不是尾结点,pA往后走一步
            lenA++;                 //lenA的长度自增一次
        }
        lenA = lenA+1;              //别忘了加上尾结点

        int lenB = 0;                //B链表的长度
        while(pB->next != NULL)      //寻找B链表的尾结点
        {
            pB = pB->next;           //如果不是尾结点,pB往后走一步
            lenB++;                  //lenA的长度自增一次
        }
        lenB = lenB+1;               //别忘了加上尾结点

        if(pA != pB){                //如果尾结点不相同,说明两个链表不会相交
            return NULL;             //返回NULL
        }

接下来就是尾结点相同,说明两个链表相交,我们一起来找交点

部分代码如下: 

 //尾结点相同,说明两个链表相交,我们一起来找交点
        int gap = abs(lenA-lenB);   //abs()函数用来求绝对值

        //假设A链表的长度比B链表短
        //用变量shortList定义A链表,变量longList定义B链表
        ListNode* shortList = headA;
        ListNode* longList = headB;

        //如果A链表的长度比B链表长
        if(lenA > lenB)
        {
            longList = headA;  //变量longList定义A链表
            shortList = headB;//用变量shortList定义B链表,
        }

        //长的链表先走长度差
        while(gap--){
            longList = longList->next;
        }
        //再同时走找交点
        while(longList != shortList){
            longList = longList->next;
            shortList = shortList->next;
        }
        //找到交点了,返回结点
        return longList;

OK,这道题被我们解决了,整体代码如下:

typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
        ListNode* pA = headA;       //定义pA指针,指向A链表的头结点
        ListNode* pB = headB;       //定义pB指针,指向B链表的头结点

        int lenA = 0;               //A链表的长度
        while(pA->next != NULL)     //寻找A链表的尾结点
        {
            pA = pA->next;          //如果不是尾结点,pA往后走一步
            lenA++;                 //lenA的长度自增一次
        }
        lenA = lenA+1;              //别忘了加上尾结点

        int lenB = 0;                //B链表的长度
        while(pB->next != NULL)      //寻找B链表的尾结点
        {
            pB = pB->next;           //如果不是尾结点,pB往后走一步
            lenB++;                  //lenA的长度自增一次
        }
        lenB = lenB+1;               //别忘了加上尾结点

        if(pA != pB){                //如果尾结点不相同,说明两个链表不会相交
            return NULL;             //返回NULL
        }

        //尾结点相同,说明两个链表相交,我们一起来找交点
        int gap = abs(lenA-lenB);   //abs()函数用来求绝对值

        //假设A链表的长度比B链表短
        //用变量shortList定义A链表,变量longList定义B链表
        ListNode* shortList = headA;
        ListNode* longList = headB;

        //如果A链表的长度比B链表长
        if(lenA > lenB)
        {
            longList = headA;  //变量longList定义A链表
            shortList = headB;//用变量shortList定义B链表,
        }

        //长的链表先走长度差
        while(gap--){
            longList = longList->next;
        }
        //再同时走找交点
        while(longList != shortList){
            longList = longList->next;
            shortList = shortList->next;
        }
        //找到交点了,返回结点
        return longList;
} 

哈哈哈,代码量看似很多,但是里面的逻辑一点也不复杂,只要认真分析,一定能克服难关!

片尾

今天我们学习了一道OJ题: 相交链表,里面运用到了计算链表的长度,查找链表的尾结点以及比较两个链表的结点等相关知识,希望看完这篇文章能对友友们有所帮助 !    !    !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(Java)数据结构——图(第六节)Dijkstra实现单源最短路径

前言 本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 Dijkstra算法(Dijkstra的实现原理) 迪杰斯特拉算法的实现,很像Prim,基本原理是: 我先找到距离集合路径…

java:字符集和字符流

字符集 规定了字符和二进制之间对应关系的一张表 字节是计算机最基本的存储单位 字符则是通过字符组成和编码而成的文本 常见字符集 1,ASCII字符集 基础字符编码标准,包含128个字符,只包括英文字母,数字和一些常见的符号 一个字节表示一个字符 所有的字符集均兼容ASCII…

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like :同 like 功能相似(模糊 匹配) (2) regexp_instr :同 instr 功能相似(返回字符所在 下标) (3) regexp_substr : 同 substr 功能相似&…

七项上榜!通付盾十一度荣登安全牛《中国网络安全行业全景图》

2024年4月12日,安全牛第十一版《中国网络安全行业全景图》(以下简称“全景图”)正式发布。通付盾凭借领先的技术实力与优秀的市场表现,成功入选身份与访问安全、应用与业务安全、移动安全、安全支撑技术与体系四大安全领域。 身份…

宝塔面板部署腾讯云的域名

一、腾讯云,搜索我的证书,点击打开如图所示,点击下砸 二、点击宝塔的证书,然后下载到桌面 三、解压 四、打开宝塔,网站》自己的项目列表中要绑定的ssl 五、对应的文件内容复制进去,保存并启用证书 六、有了…

基于SSM校园招聘信息管理系统的设计与实现说明(内附设计LW + PPT+ 源码下载)

摘 要 随着我国近年来高校不断的进行扩招,2022年全国高校的毕业生人数已经超过一千万人,而在这个时代的大学生早已不像上世纪八九十年代一样,毕业就可以分配工作,所以在当今这个时代毕业生找工作是个非常困难的事情。再加上近几…

[管理者与领导者-158] :团队管理 - 高效执行力 -1- 总体架构、策略、方法、情与法

目录 一、总体架构 二、管理者目标:管理者通过团队获得结果 2.1 考核目标 2.2 高效执行力的指标:时间、成本、质量、数量、满意度 三、管理者的管理策略:结果(头与尾) VS 过程 四、管理手段和方法 五、关于情与…

TinyEMU源码分析之中断处理

TinyEMU源码分析之中断处理 1 触发中断2 查询中断2.1 查询中断使能与pending状态(mie和mip)2.2 查询中断总开关与委托(mstatus和mideleg)2.2.1 M模式2.2.2 S模式2.2.3 U模式 3 处理中断3.1 获取中断编号3.2 检查委托3.3 进入中断3…

【教程】7代核显直通HDMI成功输出 PVE下玩AIO最有性价比的机器

大家好,我是村雨Mura,好久没写教程了,本期是7代核显直通,重点在于HDMI输出画面 本教程理论上适用于4代以后intel带核显CPU,如果你有直通成功经验欢迎评论区分享 前面有点啰嗦,想直接看教程,直…

【每日练习】二叉树

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:二叉树 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 文章目录 一、100. 相同的树1. 题目简介2.…

Go语言中channel和互斥锁的应用场景

面对一个并发问题,我们的解决方案是使用channel还是互斥锁来实现并不总是很清晰。因为Go提倡使用通信来共享内存,所以一个常见的错误就是总是强制使用channel,不管实际情况如何。但是我们应该把这两种选择作为互补手段。 首先,简单回顾一下Go语言中的channel:channel是一种交…

同步检查继电器DT-13/200额定电压100V柜内安装板前接线JOSEF约瑟

系列型号 DT-13/200同步检查继电器; DT-13/160同步检查继电器; DT-13/130同步检查继电器; DT-13/120同步检查继电器; DT-13/90同步检查继电器; DT-13/254同步检查继电器; 同步检查继电器DT-13/200 用途 DT-13型同步检查继电器用于两端供电线路的自动重合闸线路中&…

2024 年第十四届 Mathorcup 数学应用挑战赛题目C 题 物流网络分拣中心货量预测及人员排班完整思路以及源代码分享,仅供学习

电商物流网络在订单履约中由多个环节组成,图1是一个简化的物流网络示意图。其中,分拣中心作为网络的中间环节,需要将包裹按照不同流向进行分拣并发往下一个场地,最终使包赛到达消费者手中。分拣中心管理效率的提升,对整…

物联网SaaS平台

在信息化、智能化浪潮席卷全球的今天,物联网SaaS平台作为推动工业数字化转型的重要工具,正日益受到广泛关注。那么,物联网SaaS平台究竟是什么?HiWoo Cloud作为物联网SaaS平台又有哪些独特优势?更重要的是,它…

使用unicloud-map 无法展示poi的天坑

天坑!天坑!天坑 使用unicloud-map的天坑 202404121722,昨天晚上发现uni-admin中导入了unicloud-map管理端之后在chrome浏览器由于地图定位失败,一直没有办法新增poi,不过后面发现safari浏览器是可以定位出来的,所以今…

上网行为管理软件怎么选择?哪个软件好?| 三款热门行为审计软件分享

上网行为监控系统是一种用于监控和管理互联网使用行为的系统。 这种系统主要用于企业和学校等机构,以控制和管理员工或学生在工作时间或学习时间内对互联网的使用。 而现在的企业越来越信息化,随之而来的信息危机也丛生不断,企业管理软件也…

VXWorks6.9 + Workbench3.3 Simulation 代码调试

VxWorks系列传送门 本章是基于前一篇《VXWorks6.9 Workbench3.3 开发环境部署》来进行讲解的,在上一篇我们创建了一个Hello World 的项目,并将编译后的可执行文件放到了VxWorks - FTP共享文件目录下,顺利的在VxWin 系统中跑起来。 本篇着重讲…

【学习】Spring IoCDI

🎥 个人主页:Dikz12📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 Spring 是什么? 什么是 IoC容器? 传统开发模式 loC开发模式 IoC的优势 IoC 的使用 Bean的…

TMS320F280049 EPWM模块--ET子模块(7)

下图是ET子模块在EPWM中的位置。可以看到ET子模块相对较独立。接收多种信号,处理后传递给PIE和ADC。 下图是ET的内部框图,可以更具体的看到输入和输出信号。 ET内部也可以软件force产生事件信号。ET输出时可以做分频,也就是接收n次输入后才输…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点,成为外贸企业开展业务的选择。在和外贸客户沟通中,发现无论是外贸大拿还是新手小白,大家遇到一个共同的问题——发出去的开…