剑指offer:求两个链表的第一个公共节点

Posted _阿锋丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:求两个链表的第一个公共节点相关的知识,希望对你有一定的参考价值。

题目描述

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

思路及代码

stack解法:

两个链表先分别进栈 再依次出栈,从后向前遍历遇到第一个不相等的节点 返回上一个相同节点即可

/*
struct ListNode 
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) 
	
;*/
class Solution 
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) 
        ListNode *ta = pHead1;
        ListNode *tb = pHead2;
        while(ta!=tb)
//             当ta指向空的时候说明 第一个链表的长度 已经走完了,同理tb也是这样,
//             所以最后走的长度是a+b(两个链表加起来的长度)
             ta = ta ? ta->next:pHead1;
             tb = tb ? tb->next:pHead2;

         
        return ta;
    
;

双指针解法:

连接两个链表,使两个指针遍历的长度相等,遇到第一个相同的节点返回即可 还有另一种先求出较长的链表,再做遍历其实原理一样,属同种解法

/*
struct ListNode 
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) 
	
;*/
class Solution 
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) 
        if(pHead1==NULL||pHead2==NULL)
            return NULL;
        stack<ListNode*> st1;
        stack<ListNode*> st2;
        
        while(pHead1)
            st1.push(pHead1);
            pHead1 = pHead1->next;
        
        while(pHead2)
            st2.push(pHead2);
            pHead2 = pHead2->next;
        
        ListNode *cur = nullptr;
        while(!st1.empty() && !st2.empty()&& st1.top() == st2.top())
            cur = st1.top();
            st1.pop();
            st2.pop(); 
        
        return cur;
   
        
    
;

map解法:

利用map的唯一键性质,先把链表1放入map中 再依次把链表2放进去,返回第一个值为2的键即可

/*
struct ListNode 
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) 
	
;*/
class Solution 
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) 
        map<ListNode*,int> maps_List;
        if(!pHead1 || !pHead2)
            return nullptr;
        
        while(pHead1)
            maps_List[pHead1]++;
            pHead1 = pHead1->next;
        
        while(pHead2)
            maps_List[pHead2]++;
            if(maps_List[pHead2]==2)
                break;
            
            pHead2 = pHead2->next;
        
       return  pHead2;
    
;

以上是关于剑指offer:求两个链表的第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点

[8月4日]剑指 Offer 52. 两个链表的第一个公共节点

[8月4日]剑指 Offer 52. 两个链表的第一个公共节点

剑指 Offer 52-两个链表的第一个公共节点

剑指 Offer 52. 两个链表的第一个公共节点