您的位置:首页 > 其它

判断有环的链表相交和第一个公共节点(全面)

2015-07-24 17:06 197 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/kakabest123/article/details/47043993

最常见的解法:
单链表有公共节点,则必定是Y状而不是X状的。
遍历得到两个链表的长度,长链表长度m,短链表长度n,则长链表先走m-n步,然后两个链表同时逐步遍历,比较是否有相同节点。

第二种方法:
将一个链表的表尾指向另一个链表的表头,如果两个链表相交,则会形成环,否则没有环,因此转换成判断是否有环,即通过快指针和慢指针,判断快慢指针是否相等判断是否有环,有环则有公共点。
为了找到第一个公共点,将快慢指针中的一个指向链表头结点,另一个保持在相交的节点,之后,两个指针每次走一步,第一个相遇的节点即是环的入口,也即是本题中要求的第一个公共点。

补充:
重点是,上面两种方法都是基于两个链表本身无环来考虑的。 否则,对第一种方法,不方便得到链表长度;对第二种方法,找不到其中一个链表的表尾,也就无法实现拼接。

如果两个链表有环,如何判断两个链表是否相交?以及找到第一个公共节点??
(1)如果两个有环的链表相交,那么他们的环必定我公共环。
(2)如果交点不在环上,第一个公共点就是第一个交点
(3)如果交点在环上,两个链表的环的入口点不同,那么就以任意环的入口点为第一公共点。
(4)也有可能两个链表均有环,但是他们并不相交。

针对这种情况的算法:

(1)找到两个链表的环入口,如果一个为Null,连一个非Null,一定无交点,返回null;
(2)如果均为Null,则变成两个无环链表球交点问题;
(3)如果均非Null,则判断两个有环的链表是否有交点,如果环入口相同,则他们是在分支上相交;否则判断是否能从一个环中找到另一个的入口节点。

另外,对于上亿长度的链表,对其判断是否相交以及第一个公共节点,是否可以考虑用Bloom Filter算法,通过K个哈希函数将第一个链表的每个节点映射到不同位上,之后遍历第二个链表,查找相同表项,即为公共节点,需要有一定的容错性 。但是这种情况先第一个公共节点怎么求??
欢迎大家讨论指正,谢谢。

P.S:代码稍后不上。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: