题目描述:
输入两个链表,找出它们的第一个公共结点。
当不存在公共节点时,返回空节点。
样例
给出两个链表如下所示:
A: a1 → a2
↘
c1 → c2 → c3
↗
B: b1 → b2 → b3
输出第一个公共节点c1
算法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
unsigned int lena = getNum(headA);
unsigned int lenb = getNum(headB);
if(lena == 0 || lenb==0)
{
return NULL;
}
ListNode* p = headA, *q = headB;
if(lena > lenb)
{
int a = lena - lenb;
p = headA;
while(a>0)
{
p = p->next;
a--;
}
q = headB;
}
else
{
int a = lenb - lena;
p = headB;
while(a>0)
{
p = p->next;
a--;
}
q = headA;
}
while(p && q)
{
if(p==q)
return p;
else
{
p = p->next;
q = q->next;
}
}
return NULL;
}
unsigned int getNum(ListNode* head)
{
ListNode* p = head;
unsigned int cnt = 0;
while(p)
{
cnt++;
p = p->next;
}
return cnt;
}
};