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

news/2024/12/29 7:21:04/

片头

嗨! 小伙伴们,大家好! 今天我们来一起学习这道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题: 相交链表,里面运用到了计算链表的长度,查找链表的尾结点以及比较两个链表的结点等相关知识,希望看完这篇文章能对友友们有所帮助 !    !    !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

 

 


http://www.ppmy.cn/news/1415889.html

相关文章

神经网络训练中batch的作用

在神经网络训练中,batch的作用主要包括以下几个方面: 减少内存占用和计算成本:在训练神经网络时,需要加载并处理大量的数据。使用batch训练可以将数据分成较小的批次,每次处理一小部分数据,从而减少内存占用…

gitee和idea集成

1 集成插件 2 配置账号密码 3 直接将项目传到仓库 4直接从gitee下载项目

Dev C++ 下载安装+设置C++11版本

1.下载安装 DevC 软件下载及安装教程(详细、具体)_devc下载-CSDN博客 2.设置C11版本 工具---编译选项 编译器---勾选【编译时加入以下命令】---填写【-stdc11】

浅说深度优先搜索(上)——递归

好久没有讲算法了,今天我们就来谈谈“初学者”的第二个坑,深度优先搜索,其实也就是递归。 写在最前 相信很多人都和我一样刚开始的时候完全不知道怎么下手,甚至可以说是毫无头绪,那么我们来理一理递归到底要怎么写。…

Qt安装 qt-unified-windows-x64-online.exe下载慢

使用镜像站下载: 启动cmd切换到qt-unified-windows-x64-online.exe路径输入 qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject回车启动窗口,选择对应Qt版本下载 推荐一个零声学院项目课,个人觉得老师讲得…

鸿蒙HarmonyOS 与 Android 的NDK有什么不一样?

1. 序言 就像开发Android要用Android Studio一样,Android Studio(简称AS)其实是基于IDEAgradle插件android插件开发而来。 鸿蒙系统,你可以认为它和android有点像,但又是超越android的存在,除了手机&…

日志埋点功能

前言 开发中经常会有日志埋点需求, 用于统计接口的请求量、处理速度等等,为此本篇幅从一下几个维度进行分析,从零到有搭建。 技术架构解析 实现日志埋点功能,从字面意思就可以想到功能大致分为两个方向: 1、 埋点功能(logback + 封装通用SDK方法 + 共享文件夹(如果是多…

计算机网络-TCP断开连接阶段错误应对机制

连接断开阶段 四次挥手机制:TCP连接的断开需要四次挥手,这是因为双方都需要独立地关闭数据传输。第二次和第三次挥手不能合并,因为在回复第二次挥手的时候,可能还有数据没有接收完成,所以需要先回复ACK报文&#xff0c…