题解 | #两个链表的第一个公共结点#(栈)
一旦它们有公共节点,那么第一个公共节点及其之后节点都是共用的。
这样看来就很像逆序查看,逆序用栈很方便。
用两个栈分别存放两条链表。然后开始弹出两个栈的内容进行检查,如果是一致的就再弹出,直到不一致结束循环。如果全部都一致,那么有一个链表为空了也会结束循环。
这样我们只需要在一致的每一个节点都更新ans的值就好。
时间复杂度是O(n+m),空间复杂度是O(n+m)。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* ans = nullptr;
stack<ListNode*> p1, p2;
while(pHead1){
p1.push(pHead1);
pHead1 = pHead1->next;
}
while(pHead2){
p2.push(pHead2);
pHead2 = pHead2->next;
}
while(!p1.empty()&&!p2.empty()){
ListNode* cur1 = p1.top();
p1.pop();
ListNode* cur2 = p2.top();
p2.pop();
if(cur1->val==cur2->val)
ans = cur1;
else
break;
}
return ans;
}
};