面试题37:两个链表的第一个公共节点
2016-07-15 20:01
323 查看
题目:输入两个链表,找出它们的第一个公共结点。
这一题我考虑的是,先分别求出每个链表的长度,然后用一个set收集所有的值。因为set中不允许有重复的值。那么两个链表的长度和减去set的size就是公共链表的长度,再从头遍历下,即可求得。算法的复杂度是O(m*lgm+n*lgn).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) {
int num1=0,num2=0;
set<int> numset;
ListNode* temp1=pHead1;
ListNode* temp2=pHead2;
while(temp1)
{
numset.insert(temp1->val);
temp1=temp1->next;
num1++;
}
while(temp2)
{
numset.insert(temp2->val);
temp2=temp2->next;
num2++;
}
int len=num1-(num1+num2-numset.size());
int i;
ListNode* newhead=pHead1;
for(i=0;i<len;i++)
{
newhead=newhead->next;
}
return newhead;
}
}; 书上有一种O(m+n)的解法。思想是类似的。但是它并没有用一个set去保存数值。而是先分别求得链表的长度,然后对于长的链表,先走len(长的-短的),然后再一起走,第一个达到相同的节点值即为所求。
这一题我考虑的是,先分别求出每个链表的长度,然后用一个set收集所有的值。因为set中不允许有重复的值。那么两个链表的长度和减去set的size就是公共链表的长度,再从头遍历下,即可求得。算法的复杂度是O(m*lgm+n*lgn).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) {
int num1=0,num2=0;
set<int> numset;
ListNode* temp1=pHead1;
ListNode* temp2=pHead2;
while(temp1)
{
numset.insert(temp1->val);
temp1=temp1->next;
num1++;
}
while(temp2)
{
numset.insert(temp2->val);
temp2=temp2->next;
num2++;
}
int len=num1-(num1+num2-numset.size());
int i;
ListNode* newhead=pHead1;
for(i=0;i<len;i++)
{
newhead=newhead->next;
}
return newhead;
}
}; 书上有一种O(m+n)的解法。思想是类似的。但是它并没有用一个set去保存数值。而是先分别求得链表的长度,然后对于长的链表,先走len(长的-短的),然后再一起走,第一个达到相同的节点值即为所求。
相关文章推荐
- 面试3
- 面试题1
- 面试题(二)
- 金庸笔下的“程序员”
- 面试题(一)-sql查询重复数据
- WEB前端初级开发面试题归纳
- 从程序员到项目经理内容记录
- 面试题36:数组中的逆序对
- Java程序员必须掌握的8大排序算法
- 健康做好程序员
- 剑指offer面试题25:二叉树中和为某一值的路径
- 编程面试过程中常见的10大算法概念汇总
- 程序员怎样才能写出一篇好的技术文章
- "Android中的动画"-Android面试必问"精华技能点"汇总
- 【那些年遇到过的面试题】内核空间 用户空间
- "Android Touch事件分发机制"-Android面试必问"精华技能点"汇总
- 剑指offer面试题24:二叉搜索树的后序遍历序列
- 程序员跳槽注意事项
- 每个程序员都该知道的10大编程格言
- 据说一个不写blog的程序员不是一个好人