链表的相交以及链表的循环的判断以及查找

来源:互联网 发布:自己的社会网络 编辑:程序博客网 时间:2024/05/16 15:28

判断两个链表是否有交叉?
分为两种情况:
1)没有环(单链表)的交叉 
2)(循环链表)有环的链表的交叉


1)单链表:
(1)两个单链表只能存在Y型交叉,不会存在X型交叉(?)公共一起的,以后的链表如果交叉了之后,不知道指向哪里因为有两条路可以走。
最简单的方式是直接遍历到两个链表的最后一个节点,判断它们是否相同。(消耗的时间较长)
(2)再进行求相交节点的。
把第一个链表的尾节点指向第二个链表的头结点,这样就形成了一个6字型的环链表,利用我们前面那篇文章讲的方法就可以求出相交节点


*************************************
一个链表是有环一个链表没有环的,是可能相交的,因为我们可以通过画图来理解(画图),因为链表循环都是在尾部折回来,没有中间进行分支的。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


2)两个有环的链表的交叉
先对一个链表进行遍历,然后找出环点,将该链表的环在环点处断开(保持该环点),接着对第二个链表进行遍历,如果这个时候,第二个有环链表没有环了之后,那么久说明这两个有环链表是相交的,否则是不相交的。


不过我们可以看到有环的链表的交点是有两种情况的:
1)交在环点以及环点之前
2)交在环点之后的e


1)交在环点以及环点之前


假设两个链表的环点分别是p1,p2 加入p1==p2 说明相交点是在环点之前,


这时候我们可以从环点断开(这样就变成了单链表的相交的问题)如上面的讲解。


2)交在环点之后的
这样可以说明两个链表进入环的时候的点是不同的,
可以分别求出它们的环点。






前提知识点




参考链接:
判断链表是否为循环链表?以及如何查找出循环的链表的"环点"
http://www.cppblog.com/humanchao/archive/2008/04/17/47357.html
/*找出环的入口点:


当fast若与slow相遇时,slow肯定没有走遍历完链表,而fast已经在环内循环了n圈(1<=n)。假设slow走了s步,则fast走了2s步(fast步数还等于s 加上在环上多转的n圈),设环长为r,则:


2s = s + nr
s= nr


设整个链表长L,入口环与相遇点距离为x,起点到环入口点的距离为a。
a + x = nr
a + x = (n – 1)r +r = (n-1)r + L - a
a = (n-1)r + (L – a – x)


(L – a – x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,于是我们从链表头、与相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点。
最为主要的就是设置的这两个指针为什么这样设置。这一点是很重要的。
*/


链表的相关的问题:很不错的关于链表的博客
http://wuchong.me/blog/2014/03/25/interview-link-questions/




0 0