题目描述:

输入两个链表,找出它们的第一个公共结点。

分析:

思路一:暴力解法,强烈不建议!

遍历第一个链表的每个节点,同时每次都遍历一遍另一个链表,看是否有节点和这个节点相同,如果有相同节点就是公共节点,如果没有,就继续向下遍历。

思路二:长链表先走,再同步遍历

两个链表比较长短,计算出两者的长度差x,比较长的链表先往前走x步,然后长短链表一起同步向前走,看遍历到的节点是否相同,如果相同就是第一个公共节点。

思路三:用hashMap数据结构

第一个while循环遍历第一个链表,将其所有节点放入hashmap中

第二个while遍历第二个链表,用containsKey判断这个节点值是否存在第一个链表中。

(这种思路基本上就是用空间换时间)

思路四:两个链表的公共节点一定在链表的尾部

若连个链表存在公共节点,则它们的尾部一定从第一个公共节点开始完全相同。

我们分析有公共结点的两个链表有哪些特点。从链表结点的定义可以看出,这两个链表是单链表。如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的next都指向同一个结点,但由于是单向链表的结点,之后他们所有结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状开起来像一个Y,而不可能像X。

两个链表的公共节点图解

设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。

当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

解答:

思路二:长链表先走n步,然后长短链表共同向前遍历

/*

public class ListNode {

int val;

ListNode next = null;

ListNode(int val) {

this.val = val;

}

}*/

public class Solution {

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {

if (pHead1 == null || pHead2 == null) return null;

if (pHead1 == pHead2) return pHead1;

int len1 = getLength(pHead1);

int len2 = getLength(pHead2);

//让比较长的链表先走几步

if (len1 > len2) {

for (int i = 0; i < (len1 - len2); i++) {

pHead1 = pHead1.next;

}

} else {

for (int i = 0; i < (len2 - len1); i++) {

pHead2 = pHead2.next;

}

}

boolean flag = false; //标志位,判断是否走到第一个公共节点

ListNode result = null;

while (!flag) {

if (pHead1 == null || pHead2 == null) {

return null;

}

if (pHead1.val == pHead2.val) {

flag = true;

result = pHead1;

} else {

pHead1 = pHead1.next;

pHead2 = pHead2.next;

}

}

return result;

}

/*求链表长度的方法,每次求链表涨肚,需要遍历一次单链表*/

public static int getLength(ListNode pHead) {

int len = 1;

ListNode current = pHead;

while (current.next != null) {

len++;

current = current.next;

}

return len;

}

}

运行成功

这种方法可行,但是求链表的长度需要遍历一次链表,然后找到公共节点又要遍历两个链表,时间复杂度是O(M+N),但是鉴于每个链表都要遍历两遍,所以耗时还是比较多的。

如果想耗时比较少,可以考虑用空间换取时间,用hashmap存储链表1中的节点值,然后遍历一遍链表2即可。从hashmap中查找某个key值是否存在耗费的时间为O(1)。

思路四:当指针1访问到A的末尾开始访问B,当指针2访问到B的末尾开始访问A,这样,指针1,2会同时访问到公共节点。

/*

public class ListNode {

int val;

ListNode next = null;

ListNode(int val) {

this.val = val;

}

}*/

public class Solution {

public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {

ListNode l1 = pHead1, l2 = pHead2;

while (l1 != l2) {

l1 = (l1 == null) ? pHead2 : l1.next;

l2 = (l2 == null) ? pHead1 : l2.next;

}

return l1;

}

}

运行成功

简洁高效的代码是程序媛永恒的追求!

java中获取链表的第一个节点,两个链表中的第一个公共节点(java)相关推荐

  1. python获取绝对路径_python3中获取文件当前绝对路径的两种方法

    方法1: import sys print(sys.argv) 得到文件当前绝对路径字符串的一个列表 ['D:/pycharm/PracticeProject/ClientServerNetworki ...

  2. 例28:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请

    #include <stdio.h> /*** 问题描述:有5个人坐在一起,问第五个人多少岁?* 他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁 ...

  3. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个

    有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他说是10岁.请问第五个 ...

  4. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。

    题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他说是10岁.请问 ...

  5. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第 3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后 问第一个人,他说是10岁。请问第

    python实现:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第 3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后 问第一个人,他 ...

  6. 【程序23】 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大 两岁。问第2个人,说比第一个人大两岁。最后问第一

    /*2017年3月7日16:47:40java基础50道经典练习题 例23Athor: ZJYPurpose: [程序23]题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁 ...

  7. 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。 问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。 问第2个人,说比第一个人大两岁。 最后问第一个人,他说是10岁。请问

    /* 题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁. 问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁. 问第2个人,说比第一个人大两岁. 最后问第一个人,他说是 ...

  8. map中获取数组_如何从php多维数组中获取特定的键值?

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 在这篇文章中,我们将给大家介绍如何在php中从多维数组中获取特定的键值数组.这里我们将使用a ...

  9. 从hbitmap中获取位图数据_如何快速从主流数据库中获取人/小鼠数据?

    点击上方"蓝色字体"关注我们 鹿明 生物 蛋白.代谢组学服务专家 关注我们收获更多 关注 随着生物科技的迅速发展,每天都会有海量的生物学数据产生,如何有效的分析这些"生物 ...

最新文章

  1. QT中使用rubberband橡皮筋等方法进行选中多个物体
  2. latex参考文献Bib Tex的使用
  3. 图解分析一个dNet进销存软件
  4. CCF201312-3 最大的矩形(100分)
  5. Zigbee 电动智能窗帘系统 解决方案
  6. MySQL 中锁的面试题总结
  7. 苏杰专访:产品创新好方向=几十年不变的需求+硬科技赋能
  8. TOP命令及参数解析
  9. dm8148 videoM3 link源代码解析
  10. 谈表单的设计 (一) 合理对表单进行布局
  11. 对象数组题目 Student类
  12. 数据库可视化工具Navicat
  13. IE8卸载再回到IE6
  14. 独家访谈N位品牌操盘手:深度揭秘品牌自播方法论
  15. Threejs-创建旋转正方体
  16. 小马哥---高仿三星Galaxy J100H主板型号J7210国外版 刷机拆机图
  17. mount挂载硬盘出错 linux 下分区格式为lvm
  18. 【考研英语语法】一般现在时练习题
  19. 北宋政坛翘楚,文坛领袖大串联
  20. UnityShader初级篇——渐变纹理

热门文章

  1. JDK集合框架结构分析(二)
  2. mac上设置sudo不要密码
  3. 【Win10应用开发】自定义磁贴通知的排版
  4. 题目1111:单词替换
  5. Ubuntu: Ubuntu中安装使用Source Inside 3.5
  6. Visual studio 2010 中文版安装Siverlight 5 beta tools 总结
  7. Java 学习经验[转]
  8. ASP.Net页面保存持久数据的几种方法比较
  9. android音视频【十】音频mp3剪切
  10. Android v1、v2、v3签名原理