两个单链表相交的一系列问题
在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1 和 head2,这两个链表可能相交,也可能
不相交。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回 null 即可。
如果链表 1 的长度为 N,链表 2 的长度为 M,时间复杂度请达到 O(N+M),额外空间复杂度请达到 O(1)。(界定啊相交是内存地址相同)

方法:哈希表(极简单适用一切情况)依次遍历,每遍历一个节点,将其加入哈希表中,若遍历到链表最后一个节点也没有发现哈希表中有之前已经记录的节点,则表示链表无环,若遍历到某个节点发现哈希表中已经存过这个节点,则表示有环,且这个节点是第一个相交的节点。另一种方法,建立两个指针,一个快指针,一个慢指针,慢指针依次遍历链表中每个节点,快指针跳步前进,每次走两个节点,则这两个指针一定会在环中相遇,当两个指针相遇时,在链表开头再设置一个指针,开头的指针跟慢指针都继续移动,每次一步,则两个指针一定能在第一个环节点相遇

一个有环,一个无环,不可能相交
两个无环链表,可以相交,有两种结构(“||”和“Y”,不可能是“X”)不用哈希表的方法:分别得到两个链表的长度,若一个长度为50,一个长度为40,则较长的链表的指针先走10个节点,之后两个链表的指针同步前进,若出现某时刻两个指针相等,则表示相交,即“Y”,否则两链表结构是“||”
两个链表都有环:
两个链表各自都有环,没有相交,即“66”结构
两个链表在环外相交,即
Y
O
若两个链表的入环节点是同一个,则表示是“YO”结构,则求第一个相交节点与“Y”情况解法相同
两个链表共享环,即
||
O

两个链表的指针,从头开始,若Node1走到自身的节点也没有遇到Node2,则表示两个链表无交点,是“66”结构,若两个链表的指针在遇到自身节点之前遇到了另一个链表的节点,则表示“||O”结构

public static class Node{public int value;public Node next;public Node(int data){this.value = data;}
}public static Node getIntersectNode(Node haed1,Node head2){if(head1 == null || head2 == null){return null;}Node loop1 = getLoopNode(head1);Node loop2 = getLoopNode(head2);if(loop1 == null && loop2 == null){return noLoop(head1, head2);}if(loop1 != null && loop2 != null){return bothLoop(head1, loop1, head2, loop2);}return null;
}public static Node getLoopNode(Node head){if(head == null || head.next == null || head.next.next == null){return null;}Node n1 = head.next;  //n1为慢指针Node n2 = head.next.next; //n2为快指针while(n1 != n2){if(n2.next == null || n2.next.next == null){return null;}n2 = n2.next.next;n1 = n1.next;}n2 = head;while(n1 != n2){n1 = n1.next;n2 = n2.next;}n2 = head;  //n2 从头重新开始走,且变为慢指针while(n1 != n2){n1 = n1.next;n2 = n2.next;}return n1;
}public static Node noLoop(Node head1, Node head2){if(head1 == null || head2 == null){return null;}Node cur1 = head1;Node cur2 = head2;int n = 0;while(cur1.next != null){n++;cur1 = cur1.next;}while(cur2.next != null){n--;cur2 = cur2.next;}if(cur1 != cur2){return null;}cur1 = n > 0 ? head1 : head2;cur2 = cur1 == head1 ? head2 : head1;n = Math.abs(n);while(n != 0){n--;cur1 = cur1.next;}while(cur1 != cur2){cur1 = cur1.next;cur2 = cur2.next;}return cur1;
}public static Node bothLoop(Node head1, Node loop1, Node head2, Node loop2){Node cur1 = null;Node cur2 = null;if(loop1 == loop2){cur1 = head1;cur2 = head2;int n = 0;while(cur1 != loop1){n++;cur1 = cur1.next;}while(cur2 != loop2){n--;cur2 = cur2.next;}return cur1;}else{cur1 = loop1.next;while(cur1 != loop1){if(cur1 == loop2){return loop1;}cur1 = cur1.next;}return null;}
}

两个单链表相交的一系列问题相关推荐

  1. 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)

    本题来自左神<程序员代码面试指南>"两个单链表相交的一系列问题"题目. 题目 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1 和 head2, ...

  2. 两个单链表相交的一系列问题-Java

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net package live.every.day.Pro ...

  3. 两个单链表相交的一系列问题----0_0

    这道题emmm,难度相对来说很大额. 主要是要分成三种情况来考虑: 1. 两个链表都无环: 2. 两个链表都有环: 3. 一个有环一个无环,这种情况是不用 考虑的,一定没有交点(姥姥记住:单链表仅有一 ...

  4. 算法学习18-两个单链表相交的一系列问题

    两个单链表相交的一系列问题 [题目] 在本题中,单链表可能有环,也可能无环.给定两个单链表的头节点 head1和head2,这两个链表可能相交,也可能不相交.请实现一个函数, 如果两个链表相交,请返回 ...

  5. 算法题:求两个单链表相交的第一个节点

    目录 一.题目 思路 代码 二.总结 一.题目 #include <iostream> #include <stack> using namespace std; //链表结点 ...

  6. 链表问题11——两个单链表相交的系列问题(四):总结

    题目 请实现一个函数,如果两个链表相交,请返回相交的第一个节点,如果不相交,返回null即可.链表可能有环或无环. 要求 如果链表1的长度为N,链表2的长度为M,时间复杂度达到O(M+N),额外空间复 ...

  7. 链表问题11——两个单链表相交的系列问题(三):判断两个有环链表是否相交

    题目 判断两个有环链表是否相交,相交则返回第一个相交节点,否则返回null 在考虑此问题时,根据前面几篇文章的解法,我们已经得到了各自链表的入环节点,分别为loop1和loop2 思路 以下是问题三的 ...

  8. 链表问题11——两个单链表相交的系列问题(二):找到两个无环链表的交点

    题目 判断两个无环链表是否相交,相交则返回第一个相交节点,否则返回null 思路 分别遍历链表1和链表2,最后一个节点分别即为end1和end2,长度分别记为len1和len2 如果end1不等于en ...

  9. 链表问题11——两个单链表相交的系列问题(一):找到有环链表的环入口节点

    题目 判断一个链表是否有环,如果有,则返回第一个进入环的节点,没有则返回null. 思路 如果一个链表没有环,那么遍历链表一定可以遇到链表的终点:如果链表有环,那么遍历链表就永远在环里转下去了.如何找 ...

最新文章

  1. 应聘苹果数据科学家,你需要知道些什么?
  2. python time.time()计算代码运行时间
  3. 在面试中如何展示虚拟机和内存调优技能
  4. jar包冲突常用的解决方法
  5. linux 下使用 curl post
  6. 玩转 SpringBoot 2.x 之 快速集成 Jedis客户端(普通版)
  7. SpringBoot2.0之三 优雅整合Spring Data JPA
  8. 关于js对象添加属性
  9. gogs app.ini文件配置项说明
  10. cloudmusic:网易云爬虫
  11. 树莓派+欧西亚室外温度湿度传感器+Arduino Nano+433Mhz接收模块+RRDTOOL制作室内室外温湿度记录监控系统
  12. STM32与FPGA Cyclone IV芯片fsmc通信
  13. 微信朋友验证消息是什么来源_微信好友来源朋友验证消息
  14. springmvc excel下载到本地后,打开提示“因文件格式或拓展名无效。请确定文件未损坏,并且文件拓展名与文件格式匹配”...
  15. ubuntu查询显卡型号
  16. 28天高效突击大礼包:微服务+分布式+框架,java开发spark视频
  17. 码神军训(四,五)——代码跳舞军体拳
  18. IT经理的个人宣言:做一个好男人!
  19. 使用命令行进行替换文件
  20. 帝国CMS和PHPCMS对比随谈

热门文章

  1. c获取当前系统时间_Python系统:程序和进程
  2. python 少儿趣味编程下载_趣味儿童编程软件(scratch)
  3. Docker之Dockerfile 指令详解
  4. 错误传播 --try{}catch(e){console.log(e)}
  5. IDEA 搭建 maven(1)
  6. BZOJ 3144 [HNOI2013]切糕 (最大流+巧妙的建图)
  7. 开发错误记录9:Application无法跳转到Activity
  8. 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用
  9. 微信公众平台自定义菜单接口API指南
  10. ldd,locate,vimdiff