转:经典面试题:链表的相交与环问题

源地址:http://blog.csdn.net/luckyxiaoqiang/article/details/7074022

版权所有,转载请注明出处,谢谢!
http://blog.csdn.net/walkinginthewind/article/details/7074022

1.  给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。
示意图如下:

如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不相交。时间复杂度为O( len1 + len2),因为只需要一个额外指针保存最后一个节点地址,空间复杂度为O(1)。

2. 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交,若相交返回第一个相交的节点。假设两个链表均不带环。
对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,不相交,结束。
两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,比较下一个节点是不是相同,如果相同就返回该节点,若不相同,两个链表都向后走一步,继续比较。
示意图如下:



3.  给出一个单向链表的头指针pHead,判断链表中是否有环。

示意图如下:

链表中有环,其实也就是自相交。我们用两个指针p1和p2从头开始遍历链表,p1每次前进一个节点,p2每次前进两个结点,若存在环,则p1和p2肯定会在环中相遇,若不存在,则p1和p2能正常到达最后一个节点(实际上是到达NULL)。

4.  给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。
示意图如下:

红色虚线框中的节点为待求节点。
首先判断是否存在环,若不存在结束。
在环中的一个节点处断开(当然最后要记得恢复),这样就形成了两个相交的单链表,求进入环中的第一个节点也就转换成了求两个单链表相交的第一个节点。

如图所示:



小结:链表是数据结构中最基本的,也是面试中常考的,与链表相关的题目也变化多端,只要基础扎实,多积累一些处理类似问题的技巧,面试时便能应对自如。

posted @ 2013-10-26 11:50  天天向上...  阅读(351)  评论(0编辑  收藏  举报