题目描述:输入两个链表,找出它们的第一个公共结点。
struct ListNode {
int val;
struct ListNode* next;
ListNode(int x) :
val(x), next(NULL) {
}
};
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2)
{}
什么是公共节点:两个链表公用的节点,也就是这个节点既出现在这个链表也出现在另一个链表。这就有一个性质了,那就算这个公用节点之后的节点都是共同使用的。
1.暴力方法
对上面链表的每个节点,看看下面链表有没有与它相等的节点,第一个出现相等的就是第一个公共节点。
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p = pHead1;
ListNode* q = pHead2;
while (p != NULL)
{
while (q != NULL)
{
if (p == q)
{
return p;
}
q = q->next;
}
p = p->next;
q = pHead2;
}
return NULL;
}
2.另一种比较巧妙的方法
利用公共节点的特性,第一个公共节点之后所有的节点它们都是公用的。所以,链表1和链表2长度的不同主要体现在第一个公共节点之前的部分。我们可以求得两个链表得长度,然后将长度大得链表得指针先向后移动len1-len2步。这样之后,他俩在一起移动,第一处相等得位置就是第一个公共节点。
ListNode* FindFirstCommonNode(ListNode* pHead1, ListNode* pHead2)
{
ListNode* p = pHead1;
ListNode* q = pHead2;
int len1 = 0, len2 = 0;
while (p != NULL) //计算pHead1的长度 len1
{
len1++;
p = p->next;
}
while (q != NULL) //计算pHead2的长度 len2
{
len2++;
q = q->next;
}
p = pHead1;
q = pHead2;
if (len1 >= len2)
{
int tmp = len1 - len2;
while (tmp)
{
p = p->next;
tmp--;
}
}
else
{
int tmp = len2 - len1;
while (tmp)
{
q = q->next;
tmp--;
}
}
while (p != NULL)
{
if (p == q)
{
return p;
}
p = p->next;
q = q->next;
}
return NULL;
}