题解 | #两个链表的第一个公共结点#(栈)

一旦它们有公共节点,那么第一个公共节点及其之后节点都是共用的。

这样看来就很像逆序查看,逆序用栈很方便。

用两个栈分别存放两条链表。然后开始弹出两个栈的内容进行检查,如果是一致的就再弹出,直到不一致结束循环。如果全部都一致,那么有一个链表为空了也会结束循环。

这样我们只需要在一致的每一个节点都更新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;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务