剑指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;
}
};
相关文章推荐
- 剑指Offer系列-面试题37:两个链表的第一个公共结点
- 剑指Offer:面试题37 两个链表的第一个公共结点
- 剑指Offer之面试题37:两个链表的第一个公共结点
- 《剑指Offer》学习笔记--面试题37:两个链表的第一个公共结点
- 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
- (剑指Offer)面试题37:两个链表的第一个公共结点
- 剑指offer面试题[37]-两个链表的第一个公共结点
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指offer 37 两个链表的第一个公共结点
- 面试题37:两个链表的第一个公共结点
- 【剑指Offer】面试题37:两个链表的第一个公共结点
- 两个链表的第一个公共结点(面试题 37)
- 面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 知识迁移能力-面试题37-两个链表的第一个公共结点
- 剑指offer-面试题37 两个链表的第一个公共节点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 剑指offer:(37)时间效率和空间效率的平衡 :两个链表的第一个公共结点
- 剑指offer——面试题37:两个链表的第一个公共节点
- 剑指Offer----面试题37:两个链表的第一个公共结点