7.微软亚院之编程判断俩个链表是否相交(链表)
来源:互联网 发布:9月非农数据 编辑:程序博客网 时间:2024/04/24 22:08
今天看了July的一篇经典文章《程序员编程艺术:第九章、闲话链表追赶问题》,因为现在一直复习数据结构有关链表的算法,顺便总结下,学习下July大牛的判断链表是否相交。出处:http://blog.csdn.net/v_JULY_v 。
题目:给出两个单向链表的头指针,判断是否相交。
下面是July文章上面的解法:
分析:这是来自编程之美上的微软亚院的一道面试题目。请跟着我的思路步步深入(部分文字引自编程之美):
- 直接循环判断第一个链表的每个节点是否在第二个链表中。但,这种方法的时间复杂度为O(Length(h1) * Length(h2))。显然,我们得找到一种更为有效的方法,至少不能是O(N^2)的复杂度。
- 针对第一个链表直接构造hash表,然后查询hash表,判断第二个链表的每个结点是否在hash表出现,如果所有的第二个链表的结点都能在hash表中找到,即说明第二个链表与第一个链表有相同的结点。时间复杂度为为线性:O(Length(h1) + Length(h2)),同时为了存储第一个链表的所有节点,空间复杂度为O(Length(h1))。是否还有更好的方法呢,既能够以线性时间复杂度解决问题,又能减少存储空间?
- 进一步考虑“如果两个没有环的链表相交于某一节点,那么在这个节点之后的所有节点都是两个链表共有的”这个特点,我们可以知道,如果它们相交,则最后一个节点一定是共有的。而我们很容易能得到链表的最后一个节点,所以这成了我们简化解法的一个主要突破口。那么,我们只要判断俩个链表的尾指针是否相等。相等,则链表相交;否则,链表不相交。
所以,先遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不相交。这样我们就得到了一个时间复杂度,它为O((Length(h1) + Length(h2)),而且只用了一个额外的指针来存储最后一个节点。这个方法时间复杂度为线性O(N),空间复杂度为O(1),显然比解法三更胜一筹。 - 上面的问题都是针对链表无环的,那么如果现在,链表是有环的呢?还能找到最后一个结点进行判断么?上面的方法还同样有效么?显然,这个问题的本质已经转化为判断链表是否有环。那么,如何来判断链表是否有环呢?
总结:
所以,事实上,这个判断两个链表是否相交的问题就转化成了:
1.先判断带不带环
2.如果都不带环,就判断尾节点是否相等
3.如果都带环,判断一链表上俩指针相遇的那个节点,在不在另一条链表上。
如果在,则相交,如果不在,则不相交。
算法和July的方法是一样的,但是实现的方式有点不同而已。
http://blog.csdn.net/shiren_bod/article/details/6651703
- 7. 微软亚院之编程判断俩个链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交(链表)
- 7、微软亚院之编程判断俩个链表是否相交
- 算法-微软亚院之编程判断俩个链表是否相交
- 微软亚院之编程判断俩个链表是否相交
- 微软亚院之编程判断俩个链表是否相交
- 7.微软亚院之编程判断俩个链表是否相交(如果需要求出俩个链表相交的第一个节点)
- 算法面试100题——7.微软亚院之编程判断俩个链表是否相交
- 7 微软亚院之编程判断俩个链表是否相交,相交的首节点
- 7.微软亚院之编程判断俩个链表是否相交(为了简化问题,我们假设俩个链表均不带环)
- 7.微软亚院之编程判断俩个链表是否相交(如果链表可能有环)
- 第7题 微软亚院之编程判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交,并找出第一个相交结点。
- 微软面试100道之7 判断俩个链表是否相交
- 7.编程判断俩个链表是否相交
- 编程判断俩个链表是否相交
- 编程判断俩个链表是否相交
- 微软亚洲研究院面试编程题之判断两个链表是否相交
- 设置UITableview默认的背景和选择的背景
- 计算机存储单位
- jdk6.0新特性
- 应用现代化知识库
- 各种排序算法的稳定性和时间复杂度小结
- 7.微软亚院之编程判断俩个链表是否相交(链表)
- Flex官方资料
- linux开发及学习参考
- jdk1.5的新特性
- Unity3d 遮罩技术。。。找的好辛苦。。。。
- Java程序员的各种陋习
- 使能NEON的xbmc-android在non-NEON平台上的运行错误
- Flex中ArrayCollection的复制(克隆)
- 金典智力题