来源于我的博客
题目描述
输入两个链表,找出它们的第一个公共结点。
/*
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;
}
};