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

package live.every.day.ProgrammingDesign.CodingInterviewGuide.List;/*** 两个单链表相交的一系列问题** 【题目】* 在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。请实现一个函* 数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null即可。* 要求:如果链表1的长度为N,链表2的长度为M,时间复杂度请达到O(N+M),额外空间复杂度请达到O(1)。** 【难度】* 相当困难** 【解答】* 这道题需要分析的情况非常多,同时因为有额外空间复杂度为O(1)的限制,所以实现起来也比较困难。* 本题可以拆分成三个子问题,每个问题都可以作为一道独立的算法题,具体如下。* 问题一:如何判断一个链表是否有环,如果有,则返回第一个进入环的节点,没有则返回null。* 问题二:如何判断两个无环链表是否相交,相交则返回第一个相交节点,不相交则返回null。* 问题三:如何判断两个有环链表是否相交,相交则返回第一个相交节点,不相交则返回null。* 注意:如果一个链表有环,另外一个链表无环,它们是不可能相交的,直接返回null。* 全部过程参看如下代码中的getIntersectNode方法,这也是整个题目的主方法。** @author Created by LiveEveryDay*/public class TwoListIntersection {public static class Node {public int data;public Node next;public Node(int data) {this.data = data;}}public static Node getIntersectNode(Node head1, 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;}private static Node getLoopNode(Node head) {if (head == null || head.next == null || head.next.next == null) {return null;}Node n1 = head.next; // n1 -> slowNode n2 = head.next.next; // n2 -> fastwhile (n1 != n2) {if (n2.next == null || n2.next.next == null) {return null;}n2 = n2.next.next;n1 = n1.next;}n2 = head; // n2 -> walk again from headwhile (n1 != n2) {n1 = n1.next;n2 = n2.next;}return n1;}private 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;}private 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;}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;} else {cur1 = loop1.next;while (cur1 != loop1) {if (cur1 == loop2) {return loop1;}cur1 = cur1.next;}return null;}}public static void main(String[] args) {Node node11 = new Node(1);Node node12 = new Node(2);Node node13 = new Node(3);Node node14 = new Node(4);Node node15 = new Node(5);node11.next = node12;node12.next = node13;node13.next = node14;node14.next = node15;node15.next = node13;Node node21 = new Node(3);Node node22 = node15;Node node23 = node13;Node node24 = node14;node21.next = node22;node22.next = node23;node23.next = node24;node24.next = node22;System.out.printf("%d", getIntersectNode(node11, node21).data);}}// ------ Output ------
/*
3
*/

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

  1. 两个单链表相交的一系列问题

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

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

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

  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. 利用rank() 和 dense_rank() 来实现分类排名
  2. Linux内核最新的连续内存分配器(CMA)——避免预留大块内存【转】
  3. 【OJ】洛谷暴力枚举题单题解锦集
  4. Poi操作Excel
  5. walle 2.0 上线部署
  6. 使用可重启AD DS 整理活动目录数据库
  7. [转载]MySQL各类SQL语句的加锁机制
  8. (转)深度解析挖矿的逻辑和技术实现
  9. 英文文献翻译-----改进三维网格分析和分割的马尔可夫随机场
  10. Word小技巧:图片批量裁剪与大小调整
  11. 无法连接 树莓派 网线连接电脑_无显示器通过网线连接笔记本电脑玩转树莓派...
  12. 与200位专家相约,看国内外最新研发经验
  13. java求六位数以内所有自幂数
  14. 计算机开机自启文件夹,开机启动文件夹在哪
  15. title属性 给元素增加提示 title属性选择器
  16. Better to follow, follow to be better(2019 ICCV)
  17. 上岸美团,我为何放弃算法转开发
  18. 虎年啦,小老虎带你4.5分钟彻底掌握Linux中的创建-目录-文件(mkdir-touch)
  19. 阿德莱德计算机专业本科,阿德莱德大学计算机科学专业详细解读 成为IT大神就靠它...
  20. java计算算术表达式

热门文章

  1. painter2018破解版|painter2018中文破解版下载
  2. Linux 性能优化的全景指南,都在这一篇里了,建议收藏~
  3. 美团/饿了么外卖劵系统开发(现成系统源码)
  4. Windows上最好用的5款epub阅读器
  5. SCI论文投稿会经历哪些状态?
  6. 提高生产效率的几款工具
  7. Landsat8、GF-1、GF-2等遥感影像真彩色假彩色影像特征
  8. js——视播放器模板
  9. selenium 下拉框失焦定位
  10. 小白系列之通俗易懂的Hadoop