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

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

https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
#include<stack>
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        stack<ListNode* > stack1;
        stack<ListNode* > stack2;
		ListNode* common = nullptr;
		if (pHead1 == nullptr || pHead2 == nullptr) {
		return nullptr;
		}
		while (pHead1) {
			stack1.push(pHead1);
			pHead1 = pHead1->next;
		}
		while (pHead2) {
			stack2.push(pHead2);
			pHead2 = pHead2->next;
		}	

		int len;
		int num = 0;
		if(stack1.size() <= stack2.size())
			len = stack1.size();
		else
			len = stack2.size();

		for(int i = 0; i < len; i++){
			if(stack1.top() == stack2.top()){
				common = stack1.top(); 
				stack1.pop();
				stack2.pop();
				num	+= 1;
				if(num == len){
					return common;
				}		
			}

		}
		return common;	
    }
};

利用栈的思路解决第一个公共点寻找问题,由于是后进先出,而此问题的关键是两个链表的最后公共部分是相同的。

因此考虑使用两个栈分别存储两个链表,

依次比较两个栈顶的结点是否相同,循环次数为长度较短的栈的尺寸

定义一个临时指针common指向空结点,若栈顶结点相同,则临时指针指向栈顶结点,并且释放两个栈顶

直到栈顶结点不同,说明公共结点已释放完毕,此时common指向的就是第一个公共结点,返回common即可。

全部评论

相关推荐

企业都这么缺人了吗?缺人为什么还给白菜价!
真起不了响亮的名字:我给你出个主意,把公司报出来,让牛友去投,岂不美哉
点赞 评论 收藏
分享
05-12 17:28
已编辑
门头沟学院 硬件开发
ldf李鑫:不说公司名祝你以后天天遇到这样的公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务