判断有环的链表相交和第一个公共节点(全面)
最常见的解法:
单链表有公共节点,则必定是Y状而不是X状的。
遍历得到两个链表的长度,长链表长度m,短链表长度n,则长链表先走m-n步,然后两个链表同时逐步遍历,比较是否有相同节点。
第二种方法:
将一个链表的表尾指向另一个链表的表头,如果两个链表相交,则会形成环,否则没有环,因此转换成判断是否有环,即通过快指针和慢指针,判断快慢指针是否相等判断是否有环,有环则有公共点。
为了找到第一个公共点,将快慢指针中的一个指向链表头结点,另一个保持在相交的节点,之后,两个指针每次走一步,第一个相遇的节点即是环的入口,也即是本题中要求的第一个公共点。
补充:
重点是,上面两种方法都是基于两个链表本身无环来考虑的。 否则,对第一种方法,不方便得到链表长度;对第二种方法,找不到其中一个链表的表尾,也就无法实现拼接。
如果两个链表有环,如何判断两个链表是否相交?以及找到第一个公共节点??
(1)如果两个有环的链表相交,那么他们的环必定我公共环。
(2)如果交点不在环上,第一个公共点就是第一个交点
(3)如果交点在环上,两个链表的环的入口点不同,那么就以任意环的入口点为第一公共点。
(4)也有可能两个链表均有环,但是他们并不相交。
针对这种情况的算法:
(1)找到两个链表的环入口,如果一个为Null,连一个非Null,一定无交点,返回null;
(2)如果均为Null,则变成两个无环链表球交点问题;
(3)如果均非Null,则判断两个有环的链表是否有交点,如果环入口相同,则他们是在分支上相交;否则判断是否能从一个环中找到另一个的入口节点。
另外,对于上亿长度的链表,对其判断是否相交以及第一个公共节点,是否可以考虑用Bloom Filter算法,通过K个哈希函数将第一个链表的每个节点映射到不同位上,之后遍历第二个链表,查找相同表项,即为公共节点,需要有一定的容错性 。但是这种情况先第一个公共节点怎么求??
欢迎大家讨论指正,谢谢。
P.S:代码稍后不上。
- Java的服务端程序性能问题调查方法
- 结构化程序设计方法
- 土木工程转行IOS的点点滴滴,没受伤是不知道回头滴
- C语言部分题目解析
- 【Java】集合框架
- spring 实现AOP的4种方式
- 通过WiFi连接真机进行appium测试
- 优化数据页面(20)——提供筛选
- C语言流程控制之循环笔记
- 我现在的心情!!!
- android jni入门基础
- Kafka 对比 ActiveMQ
- Activity跳转实例
- UVA 4080 Warfare And Logistics 战争与物流 (最短路树,变形)
- 欢迎使用CSDN-markdown编辑器
- [apache]通过mod_dumpio模块查看http body中data信息
- date显示、设置时间
- 在adb shell中直接使用sqlite3命令操作数据库
- Online Judge System For SzNOI 题库 语法百题 C++ d021
- JavaScript权威指南_137_第15章_脚本化文档_15.8-文档和元素的几何形状和滚动-关于元素尺寸、位置、溢出的更多信息