您的位置:首页 > 其它

两个链表的第一个公共节点

2017-04-01 00:26 141 查看

来源于我的博客

题目描述

输入两个链表,找出它们的第一个公共结点。

/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/


例如:

1-2-4

   6-7

 3-5

两者第一个公共节点是6,两链表长度可能不一,但尾节点到第一个公共节点的长度是一致的。

常规解:栈

时间复杂度o(n),用两个栈各自保存两个链表,最后栈顶一定是相等的(如果有公共节点的话)

class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* t1=pHead1;
ListNode* t2=pHead2;
vector<ListNode*> stk1;
vector<ListNode*> stk2;

if(pHead2==nullptr||pHead1==nullptr)
return nullptr;
if(pHead2==pHead1) /*注意特殊情况的处理*/
return pHead2;

while(t1!=nullptr){
stk1.push_back(t1);
t1=t1->next;
}
while(t2!=nullptr){
stk2.push_back(t2);
t2=t2->next;
}

if(stk1.back()!=stk2.back())
return nullptr;
ListNode* pCommon=nullptr;

while(stk1.back()==stk2.back()){
pCommon=stk1.back();
stk1.pop_back();
stk2.pop_back();
}

return pCommon;
}
};


代码最短:

两个指针一直步进,直到两者第一次相等,即得到第一个公共节点

例如:

12467|12467 |12467 |124 67

35673|56735|67356|735 67

class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1,     ListNode* pHead2) {
ListNode* t1=pHead1;
ListNode* t2=pHead2;
while(t1!=t2){
t1=(t1==nullptr ? pHead1:t1->next);
t2=(t2==nullptr ? pHead2:t2->next);
}
return t1;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: