【剑指Offer】面试题37:两个链表的第一个公共结点
来源:互联网 发布:高达纸模淘宝店有哪些 编辑:程序博客网 时间:2024/05/18 01:29
思路整理自剑指Offer
一:题目描述
输入两个链表,找出它们的第一个公共结点。
二:解题思路
一开始看题时的思路错了,以为找两个链表第一个值相同的结点!!!
题目要求是第一个公共结点,公共!公共!公共!重要事情说三遍。
公共结点说明是两个链表的同时指向同一个内存空间(同一个结点)!
两个链表都是单链表(看题目中链表的定义),如果两个单链表有公共的结点,那么两个链表从某一时刻开始,他们的next指针指向同一个结点。
由于单链表结点只有一个next指针,因此从第一个公共结点开始,之后他们的所有结点都是重合的,不可能出现交叉。如下图所示:
如果两个链表有公共结点,那么公共结点出现在两个链表的尾部。如果我们从两个链表的尾部从后往前比较,那么最后一个相同的结点就是我们要找的结点,因为单向链表我们只能从头往后遍历,怎呢解决呢?
第一步:遍历两个链表获得链表长度m,n,假设m>n, m-n代表两个链表长度的差值
第二步:在较长的链表上线走上若干步(m-n),接着同时遍历两个链表,找到第一个相同的结点就是他们的第一个公共结点
时间复杂度O(m+n),不需要额外的辅助空间。m,n分别代表两个链表的长度
三:代码实现
/*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==NULL || pHead2==NULL){ return NULL; } //1.遍历两个链表,获得链表长度 int lenList1=0; int lenList2=0; ListNode* pNode1=pHead1; //遍历第一个链表 while(pNode1!=NULL){ lenList1++; pNode1=pNode1->next; } //遍历第二个链表 ListNode* pNode2=pHead2; while(pNode2!=NULL){ lenList2++; pNode2=pNode2->next; } //2.长度大的数组先走|lenList1-lenList2| 步 pNode1=pHead1; pNode2=pHead2; int diff=abs(lenList1-lenList2); if(lenList1>lenList2){ while(diff){ //如果短链表的长度小于长度差, pNode1=pNode1->next; diff--; } } else{ while(diff){ pNode2=pNode2->next; diff--; } } //同时遍历两个链表,找到第一个公共结点 while(pNode1!=NULL && pNode2!=NULL){ if(pNode1==pNode2) return pNode1; else{ pNode1=pNode1->next; pNode2=pNode2->next; } } return NULL; }};
阅读全文
0 0
- 【剑指offer】面试题37:两个链表的第一个公共结点
- [剑指offer]面试题37:两个链表的第一个公共结点
- 剑指Offer:面试题37 两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 《剑指Offer》学习笔记--面试题37:两个链表的第一个公共结点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 剑指offer之面试题37两个链表的第一个公共结点
- 剑指Offer----面试题37:两个链表的第一个公共结点
- 剑指offer--面试题37:两个链表的第一个公共结点
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 剑指Offer之面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指Offer系列-面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 【剑指Offer】面试题37:两个链表的第一个公共结点
- 编写字符串反转函数strrev
- SpringIOC容器的生命周期
- Navicat导出sql结构脚本并导入powerdesion(带描述Comment)
- spring mvc入门
- 【Objective-C】哈希算法(MD5)工具类
- 【剑指Offer】面试题37:两个链表的第一个公共结点
- 第二章 头文件、变量和基本类型(4)——转义序列
- OverFeat
- 一些前端开发中最常用的JS代码片段
- 10.2.0.4 DG 数据文件同步问题处理
- 题目1178:复数集合
- Android 百分比屏幕适配方案
- Centos7 dumpe2fs: 没有那个文件或目录
- POJ 1915 Knight Moves(BFS)