`
mixer_a
  • 浏览: 363617 次
社区版块
存档分类
最新评论

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

 
阅读更多
原文地址:http://blog.csdn.net/hackbuteer1/article/details/7583102
1、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。
示意图如下:

如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不相交。时间复杂度为O( len1 + len2),因为只需要一个额外指针保存最后一个节点地址,空间复杂度为O(1)。(编程之美上面有详细的介绍)
2、给出一个单向链表的头指针pHead,判断链表中是否有环。
示意图如下:

链表中有环,其实也就是自相交。我们用两个指针pslow和pfast从头开始遍历链表,pslow每次前进一个节点,pfast每次前进两个结点,若存在环,则pslow和pfast肯定会在环中相遇,若不存在,则pslow和pfast能正常到达最后一个节点(实际上是到达NULL)。
代码如下:
  1. //判断链表中是否有环
  2. boolIsExitLoop(LinkList*head)
  3. {
  4. LinkList*pslow=head;
  5. LinkList*pfast=head;
  6. while(pfast!=NULL&&pfast->next!=NULL)
  7. {
  8. pslow=pslow->next;//每次前进一步
  9. pfast=pfast->next->next;//每次前进二步
  10. if(pslow==pfast)//两个指针相遇,说明存在环
  11. returntrue;
  12. }
  13. returnfalse;//没有环
  14. }
3、给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交,若相交返回第一个相交的节点。假设两个链表均不带环。
方法一:
判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共同的结点。这个方法的时间复杂度为:O(max(len1+len2);但同时还得增加O(len1)的存储空间存储哈希表。这样减少了时间复杂度,增加了存储空间。
以链表节点地址为值,遍历第一个链表,使用Hash保存所有节点地址值,结束条件为到最后一个节点(无环)或Hash中该地址值已经存在(有环)。
方法二:
对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,则不相交,程序结束。
若相交,两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,比较下一个节点是不是相同,如果相同就返回该节点(即相交节点),若不相同,两个链表都同步向后走一步,继续比较。
示意图如下:

方法三:
由于两个链表都没有环,我们可以把第二个链表接在第一个链表的后面,如果得到的链表有环,则说明这两个链表相交。否则,这两个链表不相交。这样我们就把问题转化为判断一个链表是否有环了。最后,当然可别忘记恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。
4、给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。
示意图如下:

红色虚线框中的节点为待求节点。
首先使用第2个题目中的快、慢指针来判断链表是否存在环,若不存在结束。
若链表中存在环,我们从链表头、与两个指针的相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇的第一个点为环的入口点。

代码如下:
代码


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

原文地址:http://blog.csdn.net/hackbuteer1/article/details/75831021、 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。
示意图如下:

如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不相交。时间复杂度为O( len1 + len2),因为只需要一个额外指针保存最后一个节点地址,空间复杂度为O(1)。(编程之美上面有详细的介绍)
2、给出一个单向链表的头指针pHead,判断链表中是否有环。
示意图如下:

链表中有环,其实也就是自相交。我们用两个指针pslow和pfast从头开始遍历链表,pslow每次前进一个节点,pfast每次前进两个结点,若存在环,则pslow和pfast肯定会在环中相遇,若不存在,则pslow和pfast能正常到达最后一个节点(实际上是到达NULL)。
代码如下:
3、给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交,若相交返回第一个相交的节点。假设两个链表均不带环。
方法一:
判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共同的结点。这个方法的时间复杂度为:O(max(len1+len2);但同时还得增加O(len1)的存储空间存储哈希表。这样减少了时间复杂度,增加了存储空间。
以链表节点地址为值,遍历第一个链表,使用Hash保存所有节点地址值,结束条件为到最后一个节点(无环)或Hash中该地址值已经存在(有环)。
方法二:
对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,则不相交,程序结束。
若相交,两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,比较下一个节点是不是相同,如果相同就返回该节点(即相交节点),若不相同,两个链表都同步向后走一步,继续比较。
示意图如下:

方法三:
由于两个链表都没有环,我们可以把第二个链表接在第一个链表的后面,如果得到的链表有环,则说明这两个链表相交。否则,这两个链表不相交。这样我们就把问题转化为判断一个链表是否有环了。最后,当然可别忘记恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。
4、给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。
示意图如下:

红色虚线框中的节点为待求节点。
首先使用第2个题目中的快、慢指针来判断链表是否存在环,若不存在结束。
若链表中存在环,我们从链表头、与两个指针的相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇的第一个点为环的入口点。

代码如下:
代码


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

分享到:
评论

相关推荐

    链表面试题目总结 全

    在面试中,还可能被问到两个无环链表是否相交的问题。一个常见的方法是分别遍历两个链表并计算它们的长度,然后将较长链表先移动(长度差)的步数,之后两个指针同步移动,当两个指针指向同一个节点时,即找到了交点...

    java-leetcode题解之第160题相交链表.zip

    这是一道经典的算法问题,旨在锻炼和提升程序员对链表操作的理解与处理能力。LeetCode是一个广受欢迎的在线编程挑战平台,它提供了大量的算法题目,帮助开发者提高编程技能,特别是面试准备时。 题目描述: 题目160...

    校园招聘历年经典面试题汇总:游戏研发岗1

    在游戏研发领域,面试官常常会考察候选人的技术广度和深度,以下是一些常见的面试题及相关的知识点解析: 1. **泛型**:泛型是C++中的一种特性,允许创建参数化的类型,提高了代码的复用性和安全性。面试时可能要求...

    计算机经典面试题

    - **第7题**:链表的相交问题,可以利用双指针技术解决。 - **第8题**:一系列思维题,考察逻辑推理能力。 - **第9题**:判断数组是否为二元查找树的后序遍历结果,可以通过递归或模拟后序遍历的方式解决。

    算法面试经典 100题

    - 如果存在相同的节点,则表示两个链表相交。 #### 8. 比较怪的题 **知识点**:本题考查多种逻辑推理能力和问题解决能力。 **解题思路**: 1. **观察与实验**:通过观察现象和实验来解决问题。 2. **组合与拆分**...

    京东校园招聘历年经典面试题汇总:C++研发岗1

    2. **判断两链表是否相交及求首次相交结点** 题目要求找到两个链表的交点,如果存在,返回交点的指针;不存在则返回空。可以使用双指针法,让两个指针分别从头开始,一个每次移动一步,另一个每次移动两步,当它们...

    经典算法面试题

    【算法面试题】是软件开发人员提升自身技能的重要途径,主要涵盖数据结构和算法两大核心领域。以下将针对题目中的几个经典算法问题进行详细解析: 1. **二元查找树转双向链表**: 二元查找树(BST)转换成排序的...

    经典数据结构试题+面试题

    【数据结构与算法面试题精选】 1. **二元查找树转双向链表** 数据结构中的二元查找树(BST)具有左小右大的特性,将其转换为排序的双向链表,需要保持原有的顺序。转换过程通常采用中序遍历的方法,从根节点开始...

    常见:算法面试题总结 (2)1

    链表相交问题可以通过检查两个链表的尾部是否相等来解决。如果两个链表的长度不同,先遍历较短的链表,然后从较长链表的尾部开始遍历,直到找到相交节点或遍历完。 8. **逻辑思维题**: 这些题目的解答通常涉及到...

    2020美团面试真题解析

    * 双链表找相交结点:这是一道经典的链表算法题,考察了候选人的链表操作能力和问题解决能力。 * 10亿数,找最大100个数:这是一道大数据处理题,考察了候选人的数据处理能力和算法设计能力。 * 递归反转栈:这是...

    常见:各大公司实习生面试题总汇1

    以上是部分面试题的详细解析,这类问题不仅测试了候选人的技术能力,也考察了他们面对问题的思维方式和解决问题的策略。对于IT实习生来说,熟练掌握这些基础知识和思维技巧,有助于他们在面试中脱颖而出。

    算法大全-面试题-数据结构

    单链表的特殊问题还包括链表是否有环以及如何找到环的起点和环的长度,判断两个链表是否相交以及求解交点。这些题目考察了应聘者处理复杂数据结构时的逻辑思维能力和编程技巧。 此外,文件中还提到了用链表模拟大...

    企业数据结构与算法面试题

    - 对于无环链表,可以分别遍历两个链表到尾部,记录它们的长度,然后从长度较短的链表头部开始,每次走一步,另一个链表走长度差,如果相遇则说明相交。 8. **算法题目** - 问题1是逻辑推理题,通常需要尝试开关...

    数据结构和算法面试最新100题

    3. **判断相交:** 如果两个指针相遇,则说明两个链表相交。 **代码示例:** ```cpp bool doListsIntersect(ListNode* head1, ListNode* head2) { ListNode* p1 = head1; ListNode* p2 = head2; while (p1 != p2)...

    微软等大公司数据结构面试100题

    - 这是一个经典的动态规划问题,使用Kadane's Algorithm可以在O(n)时间内找到最大子数组和。从数组的第一个元素开始,记录当前子数组的和以及到当前位置的最大子数组和。当遇到负数时,可以选择继续扩展当前子数组...

    微软等公司数据结构-算法面试第1-100题汇总

    - 对于没有环的链表,可以同时从两个链表的头节点开始遍历,直到它们相遇,说明链表相交。 - 如果链表可能有环,可以使用Floyd判断环的方法,同时使用快慢指针,如果快指针最终追上慢指针,说明存在环。 8. **...

    微软等it公司面试100题

    #### 六、腾讯面试题:下排每个数都是上排那十个数在下排出现的次数 **题目解析**: 这是一道典型的逻辑思维题,要求根据上排给出的十个数,在下排填出对应的十个数,使得下排每个数都是上排那十个数在下排出现的...

    微软等IT名企经典笔试100题

    双指针法可以解决这个问题,一个指针从头节点开始,另一个指针从两个链表的公共节点开始,如果两个指针相遇,则链表相交;若不相遇,则不相交。对于环形链表,可以先检查是否存在环,再进行判断。 8. **怪题解答**...

    微软等公司数据结构及算法面试第1-100题汇总

    7. **判断链表是否相交**:如果链表不带环,可以分别遍历两个链表到尾部,记录长度,之后从长度短的链表头部开始,按长度差向另一个链表移动,直到相遇则相交,否则不相交。如果链表可能有环,可以使用 Floyd 环检测...

Global site tag (gtag.js) - Google Analytics