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

剑指Offer_面试题37_两个链表的第一个公共结点

2017-09-04 20:14 483 查看


题目描述

输入两个链表,找出它们的第一个公共结点。
解法一:允许使用辅助空间,利用哈希表std::unordered_set
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* res = NULL;
unordered_set<ListNode*> hash;
while(pHead1)
{
hash.insert(pHead1);
pHead1 = pHead1->next;
}
while(pHead2)
{
if(hash.find(pHead2) != hash.end())
{
res = pHead2;
break;
}
pHead2 = pHead2->next;
}
return res;
}
};

解法二:辅助空间栈,两个链表分别入栈,然后出栈到第一个不相同的结点,前一个就是第一个公共结点。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
stack<ListNode*> stack1;
stack<ListNode*> stack2;
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
ListNode *last = NULL;
while(p1)
{
stack1.push(p1);
p1 = p1->next;
}
while(p2)
{
stack2.push(p2);
p2 = p2->next;
}
while(!stack1.empty() && !stack2.empty())
{
p1 = stack1.top();
p2 = stack2.top();
if(p1 != p2){
break;
}
else
last = p1;
stack1.pop();
stack2.pop();
}
return last;
}
};

解法三:不能使用辅助空间,分别遍历两个链表得到长度,长的先走长度差步,然后一起走,找到第一个相同结点即为第一个公共结点。
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1 = 0, len2 = 0;
ListNode *p1 = pHead1, *p2 = pHead2;
if(!p1 || !p2) return NULL;
while(p1){
++len1;
p1 = p1->next;
}
while(p2){
++len2;
p2 = p2->next;
}
int step = 0;
if(len1 < len2){
step = len2 - len1;
p1 = pHead2;
p2 = pHead1;
}
else{
step = len1 - len2;
p1 = pHead1;
p2 = pHead2;
}
for(int i = 0; i < step; ++i)
p1 = p1->next;
while(p1 && p2 && p1 != p2){
p1 = p1->next;
p2 = p2->next;
}
if(p1 == p2)
return p1;
return NULL;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息