转自:http://blog.csdn.net/ssopp24/article/details/72377184

1.寻找两个链表的第一个公共结//这道题可以有很多种思路, 我们按照, 有坏到好的顺序, 来依次介绍每种思路。  同时, 这种顺序,   也是我们面对这道题时,能想到的 由易到难的思路
第一种思路:蛮力法:  简单粗暴, 蛮力法。  假设有两个链表 L1 与 L2.  我们拿出 L1 的第一个结点, 在 L2 中依次遍历一遍, 遇到数值相同结点, 则返回。    否则 , 拿出 L1 中第二个结点, 重复上述过程, 第一个返回的结点 即为两个链表的 第一个公共结点。
第一种思路的时间复杂度 为 O( m*n ), 空间复杂度 O( 1 ) 假设第一个链表长度为m, 第二个链表长度为n

第二种思路: 借助外部空间法: 我们先来 研究下 两个链表 有公共结点意味着什么, 意味着 这个公共结点为两个 链表所共有, 又因为(我们题设给出的条件为这个链表为单链表, 且结点中 只有两个数据成员, 一个为 data, 一个为指向下一个结点的指针 next)结点中 只有一个next成员, 所以, 这个公共结点之后, 两个链表的所有节点都是一样的。
即, 如图, 这两个链表, 是倒Y字形交叉, 而不是 倒X形状交叉. 所以我们可以 这样解题, 从链表的尾部开始遍历, 一直往前, 遇到的最后一个数据相同的结点 , 即是我们要找的结点。 可是这是单链表, 我们没有指向 prev  的指针, 如何从最后一个结点往前遍历呢?
这时我们就要用到栈这种数据结构, 将两个链表, 分别入 栈s1 和 s2.  入栈结束后, s1 和 s2栈顶相同。 我们 pop 栈s1 和 s2.  pop到最后一个相等的结点, 即是我们要找的结点
第二种思路 时间复杂度 O( m+n ), 空间复杂度 O( m+n )

和第一种思路相比, 时间复杂度降低, 空间复杂度上升, 相当于用 空间换时间

第三种思路:不借助外部空间法: 我们再想, 两个链表 L1 和 L2 , 如果 L1 长度 为 7 ,L2长度为  5.  则, L1 和  L2的公共结点一定在 后五个结点当中。 因为他们从公共结点往后的结点是相同的, 所以 公共结点不可能出现在 L1 的前两个结点中。
所以我们就可以, 先遍历一遍 L1 与 L2 得到他们的长度。 假如L1 为 7 . L2 为 5. 则让 L1先遍历两个结点, 接着开始同时遍历 L1 和 L2. 当它们遇到第一个数据相等的结点, 就是我们要找的 结点。
第三种思路: 时间复杂度 O( m+n ), 空间复杂度 O( 1 )
和第二种思路相比, 第三种思路, 时间复杂度没变, 空间复杂度降低 ,是最优的思路。

我们只实现第三种思路, 第二种思路的 另一种实现, 可以参见我写的 博客 树的最近公共祖先2, 使用了第二种思路

[cpp] view plain copy
  1. #include <iostream>
  2. using namespace std;
  3. template <typename T>
  4. struct ListNode
  5. {
  6. T _data;
  7. ListNode* _next;
  8. };
  9. template <typename T>
  10. size_t GetListLength( ListNode<T>* l )
  11. {
  12. size_t length = 0;
  13. while ( NULL != l )
  14. {
  15. ++length;
  16. l = l->_next;
  17. }
  18. return length;
  19. }
  20. template <typename T>
  21. ListNode<T>* FindFirstCommonNode( ListNode<T>* l1, ListNode<T>* l2 )
  22. {
  23. //进来之后, 我们首先要 判断 l1 和 l2 这两个链表 是不是 空链表。 这是很重要的。 一定不能忘!
  24. if ( NULL == l1 || NULL == l2 )
  25. return NULL;
  26. size_t sizeL1 = GetListLength( l1 );
  27. size_t sizeL2 = GetListLength( l2 );
  28. ListNode<T>* head1 = l1;
  29. ListNode<T>* head2 = l2;
  30. int lengthDif = sizeL1 - sizeL2;
  31. if ( sizeL1 > sizeL2 )
  32. {
  33. while ( 0 != lengthDif )
  34. {
  35. --lengthDif;
  36. l1 = l1->_next;
  37. }
  38. }
  39. else
  40. {
  41. while ( 0 != lengthDif )
  42. {
  43. ++lengthDif;
  44. l2 = l2->_next;
  45. }
  46. }
  47. while ( l1 != l2 )                          //第一次写判断条件时 我写的是 l1->_data != l2->_data . 后来想想没必要那样写, 之前的思路分析也有些问题。   判断条件 直接用 l1 != l2 就好了, 因为 l1 和 l2 第一个 公共结点 是同一个结点!
  48. {
  49. l1 = l1->_next;
  50. l2 = l2->_next;
  51. }
  52. return l1;                                  //注意, 如果两个链表没有 公共结点 ,则 我们这里返回 NULL.
  53. }

求两个链表的第一个公共结点各种情况及三种思路分析相关推荐

  1. 36 剑指offer--链表--两个链表的第一个公共结点

                               两个链表的第一个公共结点 题目 输入两个链表,找出它们的第一个公共结点. 思路 这道题和160.Intersection of Two Linke ...

  2. 《剑指offer》-- 两个链表的第一个公共结点、链表中环的入口结点、删除链表中的重复结点

    一.两个链表的第一个公共结点: 1.题目: 输入两个链表,找出它们的第一个公共结点. 2.解题思路: (1)第一种:找出两个链表的长度,然后让长的链表先走两个链表的长度差,接着两个链表一起走. (2) ...

  3. [转] 程序员面试题精选100题(35)-找出两个链表的第一个公共结点

    [转] http://hi.baidu.com/evrest/blog/item/bb9365fc7569378ab801a059.html 题目:两个单向链表,找出它们的第一个公共结点. 链表的结点 ...

  4. 37. 两个链表的第一个公共结点

    为什么80%的码农都做不了架构师?>>>    题目:输入两个链表,找出它们的第一个公共结点. 思路:先遍历两个链表得出它们各自的长度,然后让长链表先走,直到长度和短的一致,然后两个 ...

  5. [剑指offer]面试题37:两个链表的第一个公共结点

    面试题37:两个链表的第一个公共结点 题目:输入两个链表,找出它们的第一个公共结点.链表结点定义如下: struct ListNode {int val;ListNode *next;ListNode ...

  6. 牛客题霸 [两个链表的第一个公共结点] C++题解/答案

    牛客题霸 [两个链表的第一个公共结点] C++题解/答案 题目描述 输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的) ...

  7. c++ 链表_剑指offer系列——52. 两个链表的第一个公共结点

    题目链接门 两个链表的第一个公共结点_牛客网​www.nowcoder.com 题目描述 输入两个链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保 ...

  8. 剑指offer——面试题37:两个链表的第一个公共结点

    剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...

  9. 链表2--JZ25复杂链表的复制JZ36两个链表的第一个公共结点JZ55链表中环的入口结点JZ56删除链表中重复的结点

    JZ25复杂链表的复制 >>点击此链接 JZ36两个链表的第一个公共结点 题目描述 输入两个无环的单链表,找出它们的第一个公共结点.(注意因为传入数据是链表,所以错误测试数据的提示是用其他 ...

最新文章

  1. 重磅! SLAM从入门到精通系统教程汇总
  2. Python Tkinter小试
  3. 【Android FFMPEG 开发】Android 中执行 FFMPEG 指令 ( 集成 FFmpegAndroid 框架 )
  4. 全球与中国光电通信芯片市场数据专项调研及竞争格局分析报告2022-2028年版
  5. The Tao to Excellent
  6. 编程之美-2.17-数组循环移位
  7. 从语义开始 – 概念、意义、实践
  8. storyboard之 Segue
  9. mlock - 将页面锁入内存
  10. JavaScript学习指南
  11. Axure RP 9 使用详解视频教程-真实操作步骤
  12. 加壳、脱壳以及如何病毒免杀技术与原理
  13. 深度学习入门——03 MNIST手写数字图像集识别实验
  14. 如何查找计算机主机地址,ip地址查询 怎么查询电脑IP地址?
  15. 【工控老马】OPC通讯协议解析-OPC七问
  16. html中js左右图片切换效果,JS实现图片切换特效
  17. 怎么把ppt弄成链接的形式_如何将ppt转换成html网页格式
  18. 传动系统结构简图_由运动结构简图可知,该传动系统是
  19. MySQL数据库软件及SQL简介
  20. C语言 输出Sn = a + aa + aaa + aaaa + ······

热门文章

  1. eclipse中SSH三大框架环境搭建二
  2. C#不同窗体间通信,数据传递
  3. 虚拟机网卡无法启动获取ip地址
  4. 五问唐骏:泡妞真的如你说的那么容易?
  5. 关于proxy模式下,@Transactional标签在创建代理对象时的应用
  6. nodpad 设置护眼_Notepad++更改背景颜色(护眼色)
  7. [LeetCode] Majority Element II
  8. 突破技术管理,IT人中年危机变契机
  9. 研发工程师如何转型项目经理
  10. myeclipse8.5打包jar并引入第三方jar包