剑指offer 面试题52 两个链表的第一个公共节点

问题:输入两个链表,找出它们的第一个公共结点。

输入:两个链表头指针

输出:

思路1:经过观察,两个链表在第一个公共节点汇合,如下图

想从最后往前遍历,但由于是单向链表,所以借助栈。

分别把两个链表放入栈中,两个链表的尾节点就位于两个栈的栈顶,接下来比较两个栈顶的节点是否相同,如果相同,则把栈顶弹出,比较新的栈顶,直到找到最后一个相同的节点。

复杂度分析:时间复杂度为O(m+n),空间复杂度为O(m+n)。

思路2:长的链表先走若干步,接着在两个链表同时遍历,找到第一个公共节点。

代码:

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    int getListLen(ListNode* head)
    {
        int len=0;
        ListNode* node= head;
        while(node)
        {
            len++;
            node=node->next;
        }
        return len;
    }
    ListNode *FindFirstCommonNode(ListNode *headA, ListNode *headB) {
        int lenA=getListLen(headA);
        int lenB=getListLen(headB);
        if(headA==nullptr||headB==nullptr)
            return nullptr;
        
        int len=lenA>lenB?lenA-lenB:lenB-lenA;
        while(lenA>lenB&&len!=0)
        {
            headA=headA->next;
            len--;
        }
        while(lenB>lenA&&len!=0)
        {
            headB=headB->next;
            len--;
        }
        while(headA!=nullptr)
        {
            if(headA!=headB)
            {
                headA=headA->next;
                headB=headB->next;
            }
            else
            {
                return headA;
            }
        }
        return nullptr;
    }
};

复杂度分析:时间复杂度为O(m+n),空间复杂度O(1)。

发布了115 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_22148493/article/details/105130431
今日推荐