时间复杂度为O(m+n)。
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL){}
};
ListNode* FindFirstCommonNode( ListNode *pHead1, ListNode *pHead2)
{
ListNode* pFirstCommonNode = NULL;
if(pHead1 == NULL || pHead2 == NULL)//若输入链表有一个为空,返回空结点
return pFirstCommonNode;
ListNode* pNode1 = pHead1;
ListNode* pNode2 = pHead2;
int pLen1 = 0, pLen2 = 0;
while(pNode1)//分别计算两个链表的长度
{
pNode1 = pNode1 -> next;
pLen1++;
}
while(pNode2)
{
pNode2 = pNode2 -> next;
pLen2++;
}
int offSet = 0;
if(pLen1 < pLen2)//移动链表的头结点,将长链表的头结点与短链表的头结点对齐
{
offSet = pLen2 - pLen1;
while(offSet)
{
pHead2 = pHead2 -> next;
offSet--;
}
}
else if(pLen2 < pLen1)
{
offSet = pLen1 - pLen2;
while(offSet)
{
pHead1 = pHead1 -> next;
offSet--;
}
}
while(pHead1 && pHead2)//如果当前结点不相等,则继续同步遍历两个链表直到找到第一个公共结点
{
if(pHead1 == pHead2)
{
pFirstCommonNode = pHead1;
break;
}
else
{
pHead1 = pHead1 -> next;
pHead2 = pHead2 -> next;
}
}
return pFirstCommonNode;//返回第一个公共结点
}