如何判断两个链表相交及找到第一个相交点
来源:互联网 发布:淘宝达人直播教程 编辑:程序博客网 时间:2024/05/18 10:47
转载自:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/06/2580026.html
下面附上本文及一些个人见解:
我们学一个算法,一定是为了用吧,所谓“学以致用”吗?那么判断两个链表是否相交有什么用呢?这是因为一旦两个链表出现相交的情况,就可能发生这样的情况,程序释放了链表La的所有节点,这样就导致了另外一个与之有相交节点的链表Lb中的节点也释放了,而Lb的使用者,可能并不知道事实的真相,这会带来很大的麻烦。
1.问题分析
看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环)
(1)一旦两个链表相交,那么两个链表中的节点一定有相同地址。
(2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点。
分析出来了问题的本质,那么思路也就自然有了。
2.问题解法
2.1 哈希解法:
既然连个链表一旦相交,相交节点一定有相同的内存地址,而不同的节点内存地址一定是不同的,那么不妨利用内存地址建立哈希表,如此通过判断两个链表中是否存在内存地址相同的节点判断两个链表是否相交。具体做法是:遍历第一个链表,并利用地址建立哈希表,遍历第二个链表,看看地址哈希值是否和第一个表中的节点地址值有相同即可判断两个链表是否相交。
时间复杂度O(length1 + length2)
空间复杂度O(length1)
分析:时间复杂度是线性的,可以接受,并且可以顺便找到第一个相交节点,但是却增加了O(length1)的空间复杂度,这显然不能令人满意。
2.2 问题转化
如果两个链表中存在相交节点,那么将第二个链表接到第一个链表的后面,然后从第二个链表的表头开始遍历,如果存在环,则遍历过程一定会回到链表二的表头节点。可是这种方法似乎并不能找到第一个相交节点。怎么办呢?怎样才能判断链表中是否存在环,并且找到环的开始节点呢?
/*注:如果两个链表中存在相交节点,则在将第二个链表接到第一个链表的后面后,新构成的链表为有环单链表,问题转化为判断新的单链表是否有环以及连接点(可参考前面blog)*/
2.3 抓住要点
不妨遍历每个链表保存最后一个节点,看看最后一个节点是否是同一个节点,这种情况时间复杂度是O(length1 + length2)。基本也不需要什么空间,似乎是一个不错的想法哦,那么怎么找到第一个相交节点呢?可以遍历的过程中记录链表的长度L1和L2(假设L1>L2)这是遍历找到第一个链表中的第L1 - L2节点,然后链表一从第L1-L2个节点开始遍历,链表二从第一个节点遍历,每次前进一步,直到找到第一个相同的节点,则可以认为两个链表存在相交节点,并且该点即为第一个相交节点。这种解法的时间复杂度也是线性的,但是如果两个链表长度相差不多时,时间复杂度还是不错的。
到这里,我知道的几种典型的解法就说完了。欢迎大神们提供新的思路!!
3.问题扩展:(思考)
baidu曾经出过这样的一个笔试题目,归根到底也是找到两个链表是否存在相同的节点,但是数据量很大,即链表长度是上亿的。想想那么应该怎么处理呢?
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 如何判断两个链表相交及找到第一个相交点
- 判断两个链表是否相交,如果相交如何找到第一个相交结点。
- 判断两个单链表是否相交及找到第一个交点
- 判断两个带环链表是否相交,并求出第一个相交点
- 判断两个链表是否相交及获得相交的第一个节点
- 两个单向链表相交,找到第一个公共节点
- 数据结构 - 如何判断两个无环单链表是否相交;如果相交,给出相交的第一个结点
- 判断两个单链表是否相交同时找出第一个相交点(单链表是否有环及寻找入口节点)
- 已知有两个链表,判断它们是否相交,若相交求其第一个公共节点
- 判断两个链表是否相交,若相交,求第一个交点
- 判断两个链表是否相交并找出第一个相交节点
- 求两个相交链表相交的第一个元素
- 图书管理员的表白方式
- 死亡笔记3--异常 网络编程详解
- Mac OS X 下搭建Erlang开发环境
- 实现QT android自启动
- leetcode Palindrome Linked List 链表
- 如何判断两个链表相交及找到第一个相交点
- Android中限制EditText的最大字数
- 构造特定格式的字符串
- JAVA的包package命名规则 要小写
- IntelliJ IDEA 使用教程 - AS3篇
- LA3644(并查集,维护连通分量的集合)
- 梯度下降算法(Gradient descent)
- UVA 11627 Slalom(二分极小值极大化)
- TabLayout实战