题目描述:

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

解题思路:

这道题一开始的题意不太理解,这里的公共结点,实际上指结点指相同,在题目不存在结点值相同的不同结点。

1. 最直接的思路是对链表一的每个结点去和链表二中的结点进行比较,这样的复杂度是O(n^2)。

2. 这里的一个小技巧是,从第一个公共结点后,实际上两个链表的后面结点就是共享的了,同样考虑用空间换时间。利用栈来存每个链表中的结点。由于需要找到第一个公共结点,那么就可以比较两个栈的栈顶元素,相等就同时出栈,继续比较。需要注意的时对于每一次出栈的公共结点都需要保存,这样当两个栈顶元素不同时,之前保存的公共结点就是第一个公共结点了。复杂度降到O(n)。

3. 第三种思路是,不借助辅助空间来进行。首先分别遍历两个链表,记录二者的长度。那么其中存在一个长链表和一个短链表。那么二者的公共部分的长度一定小于等于短链表的长度,因此首先遍历完长链表比短链表多出的部分。再同时遍历两个链表,则相同的结点即为第一个公共结点。

代码:

思路二:

 /*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1==nullptr || pHead2==nullptr)
return nullptr;
stack<ListNode*>s1, s2;
ListNode* p = pHead1;
while(p!= nullptr)
{
s1.push(p);
p = p->next;
}
p = pHead2;
while(p!=nullptr)
{
s2.push(p);
p = p->next;
}
p = s1.top();
ListNode* p2 = s2.top();
while(!s1.empty() && !s2.empty())
{
if(s1.top()->val==s2.top()->val)
{
p = s1.top();
p2 = s2.top();
s1.pop();
s2.pop();
}
else
break;
}
if(p->val==p2->val)
return p;
else
return nullptr;
}
};

剑指offer:两个链表的第一个公共结点的更多相关文章

  1. 剑指Offer 两个链表的第一个公共结点

    题目描述 输入两个链表,找出它们的第一个公共结点.   思路: 题目说的很笼统,应该是有2个链表,找出公共点,第一个公共点后面的链表是共同所有的.可以用map做,直接检测map里有没有出现这个节点. ...

  2. 剑指Offer——两个链表的第一个公共结点

    题目描述: 输入两个链表,找出它们的第一个公共结点. 分析: 设置两个指针,分别从两个链表的头部开始往后遍历. 谁遍历完自己本身的,就从另一个链表开始遍历,这样大家到达第一个公共结点的时候便会相遇. ...

  3. 用js刷剑指offer(两个链表的第一个公共结点)

    题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...

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

    @selfboot 牛逼的代码,长度相同,一遍出结果, 长度不同,短的点跑完,变成长的,当长的跑完变成短的链表的时候,较长的链表已经走过了多的结点. ------------------------- ...

  5. 剑指Offer-35.两个链表的第一个公共结点(C++/Java)

    题目: 输入两个链表,找出它们的第一个公共结点. 分析: 先统计两个链表的长度,计算他们的差值,然后将两个链表对齐,再去寻找公共节点即可. 程序: C++ class Solution { publi ...

  6. [剑指Offer]52-两个链表的第一个公共节点

    题目链接 https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&t ...

  7. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  8. 剑指Offer - 九度1505 - 两个链表的第一个公共结点

    剑指Offer - 九度1505 - 两个链表的第一个公共结点2013-11-24 20:09 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例 ...

  9. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  10. 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ

    题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...

随机推荐

  1. SpringBoot 传入JSON对象参数

    1.请求参数格式必须是正确的JSON. 2.在入参中使用注解@RequestBody,用于接收JSON参数,使其自动转对象 3.关于lombok在此产生的一点小坑,@Builder对@RequestB ...

  2. SpringBoot上传文件报错,临时路径不存在

    异常信息 报错日志: The temporary upload location [/tmp/tomcat.7957874575370093230.8088/work/Tomcat/localhost ...

  3. Linq Left Join;linq左连接 (转载)

    来源 https://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html 准备一些测试数据,如下: use Test Create tabl ...

  4. unittest使用

    unittest:单元测试框架主要包含四部分: 1.测试固件(test fixture): 定义:包含执行测试前的准备setUP().测试执行完后的清扫工作tearDown() 注意: setUp() ...

  5. GROUP BY HAVING,ORDER BY

    --HAVING语句与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集. --并且HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足. ), SUM([C ...

  6. 如何用 DHCP + DNS + Web 实现一个网络架构

    为什么?为什么?为什么在浏览器里输入www.baidu.com就可以访问百度搜索,而输入pan.baidu.com就可以访问百度网盘,它是怎么实现的? 实验原理简介 在Internet中,计算机之间通 ...

  7. linux下nm命令的使用

    linux下强大的文件分析工具 -- nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件.库文件.可执行文件中的符号表,返回二进制文件中各段的信息. 目标文件. ...

  8. 正式一点的my.cnf文件

    感觉比以前的文件,配置正式了一些. 留照. [client] port #socket=/mysql/mysql.sock default-character-set=utf8 [mysqld] po ...

  9. Android Binder机制彻底梳理一

    Binder架构图: 先来瞅一下它的整体架构图: 其中粉红部分是上层的Binder,而蓝色的则是下层的Binder,很显然上层的是依赖于下层的. 什么是Binder[有个大概了解]? 这里从几个层面来 ...

  10. 网站安全DDOS攻击及监测

    一. 监测 在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息.查看网络状态可以使用netstat.nmap等工具.若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop ...