【剑指offer】36.两个链表的第一个公共结点

题目

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)


分析

由于公共结点出现在链表尾部,因此最直接的思路就是从后向前遍历链表找到第一个公共结点即可。由于本题使用的是单链表,因此要想从后往前遍历链表就必须利用堆栈。本题的主要思路如下:

  1. 若两个链表其中之一为NULL,则直接返回NULL;
  2. 否则将两个链表的各个节点依次加入两个堆栈;
  3. 最后依次将两个堆栈的栈顶元素出栈,直至连个栈顶元素的键值不等时停止循环;

github链接:JZ36-两个链表的第一个公共结点


C++ AC代码

#include 
#include 
#include 
using namespace std; 

struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

class Solution {
	public:
	    ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2) {
	    	// 链表为空直接返回NULL 
			ListNode* ans = NULL;
	        if(pHead1 == NULL || pHead2 == NULL){
	        	return ans;
			}
			stack<ListNode*> stack1,stack2;
	        ListNode* tmp1 = pHead1;
	        ListNode* tmp2 = pHead2;
	        
	        // 将两个链表的结点分别加入堆栈 
	        while(tmp1 && tmp2){
	        	stack1.push(tmp1);
	        	stack2.push(tmp2);
	        	tmp1 = tmp1->next;
	        	tmp2 = tmp2->next;
			}
			while(tmp1){
				stack1.push(tmp1);
	        	tmp1 = tmp1->next;
			}
			while(tmp2){
				stack2.push(tmp2);
	        	tmp2 = tmp2->next;
			}
			
			// 将两个堆栈的结点依次出栈,直至结点键值不相等为止 
			while(!stack1.empty() && !stack2.empty()){
				ListNode* node1 = stack1.top();
				ListNode* node2 = stack2.top();
				stack1.pop();
				stack2.pop();
				if(node1->val == node2->val){
					ans = node1;
				}else{
					break;
				}
			}
			return ans;
	    }
};

int main()
{
	int m,n,val,val1;
	while(cin>>m>>n){
		ListNode* head1 = new ListNode(0);
		ListNode* head2 = new ListNode(0);
		ListNode* tmp1 = head1;
		ListNode* tmp2 = head2;
		if(m > n){
			for(int i = 0 ; i < m-n; i++){
				cin>>val;
				ListNode* node = new ListNode(val);
				tmp1->next = node;
				tmp1 = tmp1->next;
			}
		}else if(m < n){
			for(int i = 0 ; i < n-m; i++){
				cin>>val;
				ListNode* node = new ListNode(val);
				tmp2->next = node;
				tmp2 = tmp2->next;
			}
		}else{
			;
		}
		int cnt = min(m,n);
		for(int i = 0 ; i < cnt ; i++){
			cin>>val>>val1;
			if(val != val1){
				ListNode* node1 = new ListNode(val);
				ListNode* node2 = new ListNode(val1);
				tmp1->next = node1;
				tmp2->next = node2;
				tmp1 = tmp1->next;
				tmp2 = tmp2->next; 	
			}else{
				ListNode* node = new ListNode(val);
				tmp1->next = node;
				tmp2->next = node;
				tmp1 = tmp1->next;
				tmp2 = tmp2->next; 	
			}
		}
		Solution s;
		ListNode* node = s.FindFirstCommonNode(head1,head2);
		cout<<node->val;
	}
	
	return 0;
}

你可能感兴趣的:(#,剑指offer题解)