问题:输入两个链表,找出它们的第一个公共结点。
输入:两个链表头指针
输出:
思路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)。