两个链表的第一个公共结点(剑指offer)+链表
来源:互联网 发布:龙腾管家软件下载 编辑:程序博客网 时间:2024/05/29 18:54
- 参与人数:1171时间限制:1秒空间限制:32768K
- 通过比例:31.25%
- 最佳记录:0 ms|0K(来自 running)
题目描述
链接:http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
链表的操作 可谓是面试一经常的考点。
这题注意几个测试用例:1、空链表;2、两个链表重合;3、两个链表没有公共结点,即不重合;4、其中一个链表表头在另一个链表内;5、一般情况
那么怎么解决这个问题呢。考虑 o---o---o---o---o
-
-
-
o (红色的表示另外一条链表)
如果过说蓝色的为第一个公共点,那么如果从表尾开始往前走就是最后一个公共点,可惜链表一般指的单链表,如果是双链表这题就没有意义了。既然不能从表尾开始,那么只能从表头开始了;
我们可以把上面的情况用栈来实现,先压入栈,然后再弹出,相当于从尾到头!O(m+n)只不过用了赋值空间
但是我们还可以有更好的办法。解法类似于找环的入口结点,这里也是,如果链表一的长度是5、链表二的长度数4,那我就让链表一,先走一步,再一走,那么他们相遇的点就是第一个公共结点; 如果到表尾还没相遇说明没有公共点。
#include<cstdio>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) return pHead1; if(!pHead2) return pHead2; int len1=0,len2=0; ListNode *p1,*p2; p1=pHead1; p2=pHead2; while(p1) { len1++; p1=p1->next; } while(p2) { len2++; p2=p2->next; } p1=pHead1; p2=pHead2; if(len1>len2) { while(len1>len2) { p1=p1->next; --len1; } } else { while(len1<len2) { p2=p2->next; --len2; } } while(p1) { if(p1==p2) return p1; p1=p1->next; p2=p2->next; } return p1; }};
- 【剑指offer】两个链表的第一个公共结点
- 剑指offer--两个链表的第一个公共结点
- 《剑指offer》两个链表的第一个公共结点
- 剑指offer 两个链表的第一个公共结点
- 剑指offer:两个链表的第一个公共结点
- [剑指offer]两个链表的第一个公共结点
- 剑指offer---两个链表的第一个公共结点
- 剑指offer|两个链表的第一个公共结点
- 剑指offer-两个链表的第一个公共结点
- 《剑指offer》-两个链表的第一个公共结点
- 剑指Offer: 两个链表的第一个公共结点
- 剑指offer:两个链表的第一个公共结点
- 剑指offer 两个链表的第一个公共结点
- 剑指offer--两个链表的第一个公共结点
- 剑指offer:两个链表的第一个公共结点
- 剑指Offer------两个链表的第一个公共结点
- 剑指offer--两个链表的第一个公共结点
- 剑指offer---两个链表的第一个公共结点
- 读取数量不定的输入数据
- Android 事件处理详解(三) —— 响应系统设置的事件[Configuration]
- DirectX11 山峰与河谷示例Demo
- CSS表格
- 黑马程序员——面向对象之异常(一)
- 两个链表的第一个公共结点(剑指offer)+链表
- 2015弱校联盟(1) -J. Right turn
- 外键
- 【bzoj4216】 Pig 乱搞
- c++primer读书笔记零(开读篇)
- AndroidUI 视图动画-混合动画效果 (AnimationSet)/动画效果监听
- DP HDOJ 5471 Count the Grid
- IOS项目开发规范--文件树整理
- Linux下安装pyspider 系统版本为centos7 【总结版】