您的位置:首页 > 职场人生

面试题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(长的-短的),然后再一起走,第一个达到相同的节点值即为所求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: