目录

  • 查找链表相交节点
    • 情况1: 无环链表相交
    • 情况3:链表相交于入环前及入环节点
    • 情况4:链表A、B相交于入环后或不相交

查找链表相交节点

先判断链表A和B是否有环,并分别找到他们的环入口(loopA,loopB),具体方法可以参考我的上一篇博客判断链表中是否有环,并查找链表环入口。

可能有以下几种情况:

 1. (loopA == NULL && loopB == NULL);链表A、B均无环;2. ((!loopA && loopB) || (loopA && !loopB));链表A、B中有一个有环,有一个无环,这种情况A、B必定不相交;3.  (loopA == loopB && loopA);链表A、B相交于入环前或入环节点4. (loopA != loopB && loopA && loopB);链表A、B相交于入环后(不包括入环节点),或不相交

情况1: 无环链表相交


指针pA指向链表A头节点(A1),pB指向链表B节点(B1),pA,pB均每次前进一步。当pA到达链表A尾部,令pA指向B1;同样,pB到达链表B尾部,令pB指向A1。当pA等于pB时,即为A,B相交节点。

 pA经过的节点为: A1->A2->C1->C2->B1->B2->B3->C1pB经过的节点为: B1->B2->B3->C1->C2->A1->A2->C1

将A,B链表中的节点分为3个部分:
1. 链表A独立节点;
2. 链表B的独立节点;
3. 链表A、B的共同部分;
由上可知,pA、pB指针在第二次到达链表A、B链表相交节点时,必定分别遍历一次链表中第1,2,3部分,所以此时pA、pB必定同时到达相交节点(即pA==pB)。

链表没有相交时,可以认为相交于尾节点后一个节点(NULL)。

代码如下:

// 返回链表相交节点,若没有相交返回NULL
// 不考虑链表中存在环路的情况
ListNode *getIntersectionNodeNoLoop(ListNode *headA, ListNode *headB) {if(!headA || !headB) return NULL;ListNode *pa = headA;ListNode *pb = headB;while(pa != pb){pa = pa ? pa->next : headB;pb = pb ? pb->next : headA;}return pa;
}

情况3:链表相交于入环前及入环节点


将入环节点当做链表A、B的尾节点,此时,查找相交节点方式与无环链表相同。

// 返回链表相交节点,若没有相交返回NULL
// 相交节点位于入环前
// loop 为链表中环的入口节点,因为相交于入环前,所以两个链表入口节点相同
ListNode *getIntersectionNodeBeforeNode(ListNode *headA, ListNode *headB, ListNode *loop) {if(!headA || !headB) return NULL;ListNode *pa = headA;ListNode *pb = headB;while(pa != pb){pa = pa != loop ? pa->next : headB;pb = pb != loop ? pb->next : headA;}return pa;
}

情况4:链表A、B相交于入环后或不相交


首先判断链表是否相交,指针cur从链表A的入口节点loopA开始每次前进一步,若找到与链表B入口节点loopB相同节点,则链表A、B相交;若cur再次到达loopA,依然没有与loopB相同节点,则不相交。

bool IsIntersection(ListNode *loopA, ListNode *loopB){ListNode *cur = loopA;while(cur != loopB){cur == cur->next;if(cur == loopA) return false;}return true;
}

在这种情况下,若A、B相交,loopA和loopB均为相交节点。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {// 获取链表入环节点,见[判断链表中是否有环,并查找链表环入口](https://blog.csdn.net/hander_left/article/details/107718329)ListNode *loopA = detectCycle(headA);ListNode *loopB = detectCycle(headB);if(loopA == NULL && loopB == NULL) { // 情况1:无环链表return getIntersectionNodeNoLoop(headA, headB);}if(loopA == NULL || loopB == NULL){ // 情况2:不相交return NULL;}if(loopA == loopB) { // 情况3: 相交于入环前或入环节点return getIntersectionNodeBeforeNode(headA, headB, loopA);} // 情况4if(IsIntersection(loopA, loopB){return loopA; // return loopB;}return NULL;
}

查找相交链表相交节点相关推荐

  1. 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ

    LeetCode24. 两两交换链表中的节点 力扣题目链接 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点.你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换). 示例 ...

  2. 数据结构与算法之复制含有随机指针节点的链表和两个链表相交的一系列问题

    数据结构与算法复制含有随机指针节点的链表和两个链表相交的一系列问题 目录 复制含有随机指针节点的链表 两个链表相交的一系列问题 1. 复制含有随机指针节点的链表 题目概述 思路:创建一个HashMap ...

  3. 链表题目----5 相交链表 和 环形链表 和 返回链表开始入环的第一个节点

    相交链表 思路 链表交叉不可能是x型 因为有可能两个链表不等长,所以我们必须让他们从同一起跑位置去起跑 从同一起跑位置出发,依次比较每个结点的地址是否相同 /*** Definition for si ...

  4. 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点

    题目 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点. 解析 第一步,判断链表是有环链表还是无环链表: 如果一个单链表无环,它一定有一个指向null的尾结点: 如 ...

  5. LeetCode简单题之相交链表

    题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表不存在相交节点,返回 null . 图示两个链表在节点 c1 开始相交: 题目数据 保证 ...

  6. 转:链表相交问题 详解

    源地址:http://blog.163.com/bbluesnow@126/blog/static/27784545201251051156817/ 链表相交问题 2012-06-10 17:15:3 ...

  7. 如何判断链表有环、如何判断两个链表相交

    如何判断单链表是否存在环 有一个单向链表,链表当中有可能出现"环",就像题图这样.如何用程序判断出这个链表是有环链表? 不允许修改链表结构. 时间复杂度O(n),空间复杂度O(1) ...

  8. 数据结构实验--带环、相交链表问题

    一.问题描述: 基于课程上机关于单链表的作业,要求进一步实现以下需求: 1.构造链表后,将元素值为 m 和 n(从键盘输入,如有多个相同元素值,仅考虑首个出现的元素)的节点建立连接,注意判断节点出现的 ...

  9. 【每日一算法】相交链表

    微信改版,加星标不迷路! 每日一算法 - 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, l ...

最新文章

  1. ***警告即将发起重大*** 谁会是下一个目标?
  2. 《Android深度探索(卷1):HAL与驱动开发》——1.6节 Linux设备驱动
  3. zabbix 安装配置介绍
  4. domain logic approaches
  5. 2020年最畅销的20款电动汽车,特斯拉和五菱你偏向谁?
  6. 知识图谱实践篇(一):数据准备和本体建模
  7. 手术期间重读《倚天屠龙记》
  8. python中可选参数是什么意思_Python如何定义有可选参数的元类
  9. 个人阅读作业 The Last
  10. 单溶水箱串级控制计算机控制,单容水箱液位控制系统
  11. 广和通亮相世界宽带论坛2022,构建5G FWA全场景无线宽带体验
  12. OCR概述和CRAFT
  13. windows使用备忘录
  14. 编译一个OrangeFox(橙狐) recovery
  15. 每日codingame小游戏练习[2021.3.29](python3入门学习之rstrip方法)
  16. GIC 基础知识介绍 (一)
  17. 重新认识 Java 中的内存映射(mmap)
  18. [重庆思庄每日技术分享]-ORACLE升级补丁查询
  19. html文件导入excel 出现乱码,win7系统txt导入excel出现中文乱码的解决方法
  20. 【单片机】简单I/O口扩展

热门文章

  1. 拼图游戏java(三)实现鼠标点击图片上下左右移动
  2. SRC漏洞提交平台和应急响应中心
  3. -XX:SoftRefLRUPolicyMSPerMB从名字看不出什么意思?【官文解读】
  4. VS Reporting Service--新建报表
  5. CSS圆角边框、盒子阴影、文字阴影(01-07课)
  6. armbian开启ssh_armbian笔记
  7. Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。
  8. python表求列平均值_python中表列的平均值
  9. 论文投稿指南——中国(中文EI)期刊推荐(第4期)
  10. 大数据分析原地踏步 原来是分析工具面临信任问题