文章目录

  • 一、链表尾部重合
    • 1、步骤
    • 2、代码分块
      • 2.1 数据结构
      • 2.2 获取入环结点
      • 2.3无环链表处理
      • 2.4 有环链表处理
    • 3、代码

一、链表尾部重合

1、步骤

> 首先判断是否有环:【若有环,则返回入环结点】方法1:可使用set容器,每次将链表结点压入时,进行查询;方法2:使用快慢指针【快指针走两步,慢指针走一步】若走不到空结点,则有环。且当两个指针相遇时,快指针回到头节点,两个指针每次走一步,当两个指针相遇时,就是入环结点;
> 若链表无环:  两条无环链表,先进行长度判断。在将长的链表的前面多余部分去除,在与另一个链表进行循环判断。
> 若链表有环且入环结点相等:则重复上述无环操作;
> 若链表有环且入环结点不相等:则让其中一个链表的入环结点开始循环,是否能遇到另一条入环结点,若可以则返回其中一个即可,否则返回null

2、代码分块

2.1 数据结构

2.2 获取入环结点

2.3无环链表处理

2.4 有环链表处理

3、代码

/*----------------------------------------------------------------------> File Name: intersect.cpp> Author: Jxiepc> Mail: Jxiepc> Created Time: Fri 04 Feb 2022 08:20:21 PM CST
----------------------------------------------------------------------*//*** 判断两个链表是否有相交* 2) 两条无环链表;* 1)两个有环链表若相交返回第一个相交结点;* 2)* */#include <iostream>typedef struct linkNode {int val;struct linkNode *next;/* 重载!=运算符 */bool operator!= (struct linkNode *node) {if(this->val != node->val || node->next != this->next)return true;return false;}/* 重载==运算符 */bool operator==(struct linkNode *node) {if(this->val != node->val || node->next != this->next)return false;return true;}
}LinkNode;/** 判断是否有环,找到入环第一个环结点,若无环,则返回null */
LinkNode* getLoopNode(LinkNode *head) {if(head == nullptr || head->next == nullptr || head->next->next == nullptr)return nullptr;/* 慢指针每次走一步 */LinkNode *n1 = head->next;/* 快指针每次走两步 */LinkNode *n2 = head->next->next;/* 当两个指针相遇时,则快指针返回头节点,继续每次走一步后,相遇时则为入环结点 */while(n1 != n2) {if(n2->next == nullptr || n2->next->next == nullptr) return nullptr;n2 = n2->next->next;n1 = n1->next;}/* 快指针继续返回头结点 */n2 = head;/* 当在次相遇则为入环结点 */while(n1 != n2) {n1 = n1->next;n2 = n2->next;}return n1;
} /** 链表无环,返回第一个相交结点 */
LinkNode* noLoop(LinkNode *head1, LinkNode *head2) {if(head1 == nullptr || head2 == nullptr)return nullptr;LinkNode *cur1 = head1;LinkNode *cur2 = head2;int n = 0;/** 判断两个链表的长度 */while(cur1->next != nullptr) {n++;cur1 = cur1->next;}while(cur2->next != nullptr) {n--;cur2 = cur2->next;}if(cur1 != cur2) {return nullptr;}/** 从定位链表长短 */cur1 = n > 0 ? head1 : head2;cur2 = cur1 == head1 ? head2 : head1;n = abs(n);/* 长链表先走完多出的部分 */while(n != 0) {n--;cur1 = cur1->next;}/* 此时两个链表长度相同,则一起循环判断相等结点 */while(cur1 != cur2) {cur1 = cur1->next;cur2 = cur2->next;}return cur1;
}/** 两个有环链表,返回第一个相交结点 */
LinkNode* bothLoop(LinkNode *head1, LinkNode *loop1, LinkNode *head2, LinkNode *loop2) {LinkNode *cur1 = nullptr;LinkNode *cur2 = nullptr;/* 判断入环结点是否相等 */if(loop1 == loop2) {cur1 = head1;cur2 = head2;int n=0;/* 循环的到入环结点结束 */while(cur1 != loop1) {n++;cur1 = cur1->next;}/* 循环的到入环结点结束 */while(cur2 != loop2) {n--;cur2 = cur2->next;}/* 重新赋值head */cur1 = n > 0 ? head1 : head2;cur2 = cur1 == head1 ? head2 : head1;n = abs(n);while(n != 0) {n--;cur1 = cur1->next;}while(cur1 != cur2) {cur1 = cur1->next;cur2 = cur2->next;}return cur1;} else {cur1 = loop1->next;while(cur1 != loop1) {if(cur1 == loop2) return loop1;cur1 = cur1->next;} return nullptr;}
}LinkNode* getIntersectNode(LinkNode *head1, LinkNode *head2) {if(head1 == nullptr || head2 == nullptr)return nullptr;LinkNode *loop1 = getLoopNode(head1);LinkNode *loop2 = getLoopNode(head2);if(loop1 == nullptr && loop2 == nullptr)return noLoop(head1, head2);if(loop1 != nullptr && loop2 != nullptr)return bothLoop(head1, loop1, head2, loop2);return nullptr;
}int main(int argc, char* argv[])
{LinkNode *Node1 = new LinkNode[10];LinkNode *Node2 = new LinkNode[10];LinkNode n1, n2, n3, n4, n5, n6, n7, n8, n9, nn1, nn2, nn3;n1.val = 10;n2.val = 3;n3.val = 5;n4.val = 2;n5.val = 8;n6.val = 7;n7.val = 6;n8.val = 9;n9.val = 1;nn1.val = 11;nn2.val = 23;nn3.val = 12;/* 链表1 */Node1->next = &n1;n1.next = &n2;n2.next = &n3;n3.next = &n4;n4.next = &n5;n5.next = &n6;n6.next = &n7;n7.next = &n8;n8.next = &n9;n9.next = nullptr;/* 链表2 */Node2->next = &nn1;nn1.next = &nn2;nn2.next = &nn3;nn3.next = &n4;/* 打印链表 */LinkNode *tmp1 = new LinkNode;tmp1 = Node1;while(tmp1->next != nullptr) {tmp1 = tmp1->next;std::cout << tmp1->val << " ";}std::cout << std::endl;LinkNode *tmp2 = new LinkNode;tmp2 = Node2;while(tmp2->next != nullptr) {tmp2 = tmp2->next;std::cout << tmp2->val << " ";}std::cout << std::endl;LinkNode *ret = new LinkNode;ret = getIntersectNode(Node1, Node2);std::cout << ret->val << std::endl; return 0;
}

算法【链表】 | 【链表尾部重合问题】相关推荐

  1. python定义链表节点_Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...

    本文实例讲述了Python数据结构与算法之链表定义与用法.分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表类插入和 ...

  2. Java数据结构与算法 day02 链表

    文章目录 第三章 链表 单链表介绍和内存布局 单链表创建和遍历的分析实现 添加(创建)过程 遍历过程 代码实现 单链表按顺序插入节点 单链表节点的修改 单链表节点的删除和小结 单链表面试题 新浪面试题 ...

  3. 数据结构与算法:链表

    前言 本文主要讲解链表,包括单向链表,双向链表,环形单链表,约瑟夫问题 数据结构与算法文章列表 数据结构与算法文章列表: 点击此处跳转查看 目录 (一)链表(Linked List)介绍 链表是有序的 ...

  4. 数据结构与算法 内核链表实现商品购物系统项目+Makefile

    数据结构与算法 内核链表实现商品购物系统项目 第一章 项目实现思维 [1]编译介绍 [2]框架思维 第二章 Makefile编写 第三章 代码编写实现 [1]favorite.txt文件 [2]his ...

  5. 一文通数据结构与算法之——链表+常见题型与解题策略+Leetcode经典题

    文章目录 1 链表 1.1 常见题型及解题策略 1.1.1 LeetCode中关于链表的题目有以下五种类型题: 1.1.2 解题策略 1.2 链表的基本内容 1.2.1 链表的基本结构: 1.2.2 ...

  6. java 链表算法_JAVA数据结构与算法之链表(一)

    单项链表 链表介绍: 链表是有序的列表,但是它在内存中是存储如下 1)链表是以节点的方式来存储, 是链式存储 2) 每个节点包含 data 域, next 域:指向下一个节点. 3) 如图:发现 链表 ...

  7. 数据结构算法入门--链表

    2019 年第 76 篇文章,总第 100 篇文章 本文大约 3200 字,阅读大约需要 10 分钟 数据结构算法系列: 数据结构算法入门系列第三篇--链表,链表也是非常常见的数据结构,面试过程中也会 ...

  8. java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...

    前言 上一次我们讲到了数据结构:栈和队列,并对他们的运用做了一些介绍和案例实践:我们也讲到了怎么简单的实现一个四则运算.怎么去判断标签是否闭合完全等等,anyway,今天接着和大家介绍一些数据结构: ...

  9. Python数据结构与算法(五)--链表

    链表 链表的定义: 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址). 单项链 ...

最新文章

  1. 北京出台自动驾驶新规:自动驾驶车辆须配备司机应急
  2. 简单快速的开发WEB应用, PHP 框架 Lemon 介绍
  3. python3.6.1安装教程-ipython安装(python3.6.1)(转载)
  4. MySQL - 践行索引优化
  5. 深度学习的数学 (6)误差反向传播法必需的链式法则
  6. Android Gradle Plugin 源码阅读与编译
  7. C++类的使用(六)—— 判断继承
  8. python是属于it界吗_转行IT行业,Python是不是一个好的选择?
  9. [深度学习] Keras 如何使用fit和fit_generator
  10. python基础03——数据类型string
  11. 首发骁龙898!小米12系列屏幕方案曝光:双曲面屏+全新封装工艺
  12. 谷歌浏览器设置请求头_2020年 谷歌SEO优化 十大技巧(四)
  13. dp、px之间单位转换Util
  14. Ubuntu 远程管理常用命令
  15. 社交网络分析初步学习1.md
  16. Qt线程:QThread
  17. 【时间之外】金融数据中心机房应对监管(最新出炉)
  18. 中华石杉Java面试突击第一季笔记二(分布式搜索引擎)
  19. 从《天龙八部 3D》到《诛仙》手游,我们如何连续做出成功产品?
  20. 当华为云WeLink遇上华为企业智慧屏,端云协同视频会议究竟有多神奇

热门文章

  1. Surround360 README文档——中文翻译
  2. 全国计算机等级考试python试题_全国计算机等级考试二级Python真题及解析(5)
  3. bootstrap4.0图标使用_很不错的两款Bootstrap Icon图标选择组件
  4. 惊了 消息中间件合集:MQ(ActiveMQ/RabbitMQ/RocketMQ)+Kafka+笔记
  5. Pnet抓包工具Wireshark提示end of file on pipemagic during open
  6. 【模电知识总结】三极管
  7. RS485调试的几个要点
  8. 计算机和红楼梦,电脑计算机与红楼梦的故事
  9. 成都盛铭轩电商:活动图片如何设计
  10. 中国设计在重庆丨5G+VR直播直击秋冬风尚大秀