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

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

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即可。

全部评论

相关推荐

机械打工仔:第一位颇有孟德之志
点赞 评论 收藏
分享
牛客刘北:如果暑期实习是27届的话,你要晚一年才会毕业,企业为什么会等你呢?要搞清时间逻辑呀!27届现在实习只能是在暑假实习,这是日常实习,不是暑期实习。所以多去投日常实习吧,暑期实习肯定不会要你的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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