(剑指Offer)面试题37:两个链表的第一个公共结点
题目:
输入两个链表,找出它们的第一个公共结点。
链表结点的定义如下:
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){};
};
思路:
1、暴力法
遍历第一个链表,每遍历到一个结点,在第二个链表中顺序遍历,如果在第二个链表上有一个结点和该结点一样,说明两个链表在这个结点上重合,也就是第一个公共结点。
时间复杂度:O(mn)
2、堆栈法
如果两个链表存在公共结点,那么从第一个公共结点到链尾,所有结点都是重合的,如果我们从两个链表的尾部开始往前比较,最后一个相同的结点就是第一个公共结点。
但单链表只有后继指针,不能往回移动,我们可以很快想到了栈,将两个链表的结点分别放入两个栈里,这样两个尾指针都在栈顶,接着下就比较栈顶指针是否相同,如果是,则把栈顶弹出,继续比较下一个栈顶,直至找到最后一个相同的结点。
时间复杂度:O(m+n),空间复杂度:O(m+n)
3、两个指针
首先分别遍历两个链表A,B,得到各自的长度如lenA,lenB,假设lenA>lenB,然后让A指针先走lenA-lenB步,接着两个指针一块走,直至相遇即找到第一个公共结点。
时间复杂度:O(m+n)
代码:
这里只实现方法3
struct ListNode{
int val;
ListNode* next;
ListNode(int x):val(x),next(NULL){};
};
unsigned int GetListLength(ListNode* pHead){
unsigned int len=0;
while(pHead!=NULL){
len++;
pHead=pHead->next;
}
return len;
}
ListNode* FindFirstCommonNode(ListNode* pHead1,ListNode* pHead2){
unsigned int len1=GetListLength(pHead1);
unsigned int len2=GetListLength(pHead2);
ListNode* pLong=pHead1;
ListNode* pShort=pHead2;
unsigned lenDiff=len1-len2;
if(len1<len2){
pLong=pHead2;
pShort=pHead1;
lenDiff=len2-len1;
}
for(unsigned int i=0;i<lenDiff;i++)
pLong=pLong->next;
while(pShort!=NULL && pLong!=NULL && pShort!=pLong){
pShort=pShort->next;
pLong=pLong->next;
}
ListNode* pFirstCommonNode=pLong;
return pFirstCommonNode;
}
在线测试OJ:
http://www.nowcoder.com/books/coding-interviews/6ab1d9a29e88450685099d45c9e31e46?rp=2
AC代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2) {
int len1=GetListLength(pHead1);
int len2=GetListLength(pHead2);
ListNode* pLong=pHead1;
ListNode* pShort=pHead2;
int lenDiff=len1-len2;
if(len1<len2){
pLong=pHead2;
pShort=pHead1;
lenDiff=len2-len1;
} for(int i=0;i<lenDiff;i++)
pLong=pLong->next; while(pLong!=NULL && pShort!=NULL && pLong!=pShort){
pLong=pLong->next;
pShort=pShort->next;
} ListNode* pFirstCommonNode=pLong;
return pFirstCommonNode;
} unsigned int GetListLength(ListNode* pHead){
unsigned int len=0;
while(pHead!=NULL){
++len;
pHead=pHead->next;
}
return len;
}
};
(剑指Offer)面试题37:两个链表的第一个公共结点的更多相关文章
- 剑指Offer - 九度1505 - 两个链表的第一个公共结点
剑指Offer - 九度1505 - 两个链表的第一个公共结点2013-11-24 20:09 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例 ...
- 【剑指Offer】36、两个链表的第一个公共结点
题目描述: 输入两个链表,找出它们的第一个公共结点. 解题思路: 本题首先可以很直观的想到蛮力法,即对链表1(假设长度为m)的每一个结点,遍历链表2(假设长度为n),找有没有与其相同的 ...
- 剑指offer 面试题52. 两个链表的第一个公共节点
这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...
- 【剑指offer】面试题 52. 两个链表的第一个公共结点
面试题 52. 两个链表的第一个公共结点 NowCoder 题目描述 输入两个链表,找出它们的第一个公共结点. Java 实现 ListNode Class class ListNode { int ...
- 【Offer】[52] 【两个链表的第一个公共结点】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个链表,找出它们的第一个公共结点.下图中6为公共结点:  牛客网刷题地址 思路分析 如果两个链表有公共节点,那么公共节点出现在两 ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- 剑指Offer(三十六):两个链表的第一个公共结点
剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ
题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...
- 《剑指offer》第五十二题(两个链表的第一个公共结点)
// 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点. #include <iostream> #include "List.h&quo ...
- 【剑指offer】两个链表的第一个公共结点,C++实现
原创文章,转载请注明出处! 博客文章索引地址 # 题目 #举例 如果两个单向链表有公共的节点,那么这两个链表从第一个公共结点开始,之后所有结点都是重合的,不可能再出现分叉.拓扑结构如下图所示: # 思 ...
随机推荐
- 六十二 Web开发 使用模板
Web框架把我们从WSGI中拯救出来了.现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了. 但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要.在函数中返回一 ...
- CentOS7下Samba的安装与配置
一.Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享 ...
- 跨域请求方式之Jsonp形式
在浏览器端才有跨域安全限制一说,而在服务器端是没有跨域安全限制的. 在两个异构系统(开发语言不同)之间达到资源共享就需要发起一个跨域请求. 而浏览器的同源策略却限制了从一个源头的文档资源或脚本资源与来 ...
- Power BI连接至Amazon Redshift
一直在使用Power BI连接至MongoDB中,但效果一直不是太理想,今天使用另一种方法,将MongoDB中的数据通过Azure Data Factory转入Amazon Redshift中,而在P ...
- manacher算法求最长回文子串
一:背景 给定一个字符串,求出其最长回文子串.例如: s="abcd",最长回文长度为 1: s="ababa",最长回文长度为 5: s="abcc ...
- thinkphp 检测上传的图片中是否含有木马脚本
1.检测原理 要想检测图片中是否含有木马脚本,首先从制作原理来分析这种木马程序.这种木马程序是十六进制编码写的,图片的十六进制代码中主要包含<% ( ) %>.<? ( ) ?> ...
- Standard - 多线程基本概念面试题待整理
http://blog.csdn.net/dazhong159/article/details/7948327 http://z-jiankun.iteye.com/blog/1408471 http ...
- JZYZOJ1544 [haoi2016T2]放棋子 错排公式 组合数学 高精度
http://172.20.6.3/Problem_Show.asp?ID=1544&a=ProbNF 看了题解才意识到原题有错排的性质(开始根本不知道错排是什么). 十本不同的书放在书架上. ...
- [P2526][SHOI2001]小狗散步
Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...
- [BZOJ5046]分糖果游戏
题目大意: 有a,b两个人分糖,每个人都有一个能量值. 每个人每一轮可以选择进行两种操作: 1.取走最左边的糖果,补充相应的能量值并获取相应的美味度. 2.跳过这一轮,能量值-1. 问在每个人都采取最 ...