题目:输入两个链表,找出他们的第一个公共结点;
思路:
链表的结点包含结点值以及结点指向的下一个结点的地址。
公共结点是指结点值相同,结点指向的下一个结点也相同。如果下一个结点也相同,那么下一个结点的值记忆下一个结点指向的结点也相同。即,从此公共结点开始,两个链表相遇,且之后的结点都是相同的,也就是重合了。(因为结点地址相同,结点值相同,指向的下一个节点的地址也相同)。也就是说:如果有两个结点指针,p1 == p2,这句话意味着两个链表从此结点开始及其之后的所有结点都是相同的了。
所以,首先计算两个链表的长度,定义两个指针分别指向两个链表的头结点,然后让较长的链表指针先走几步,事剩下的长度与较短链表相同,然后开始找公共结点,判断两个结点是否相同,不相同则同时继续往后走,相同则返回次结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len1 = Findlen(pHead1);
int len2 = Findlen(pHead2);
ListNode* p1 = pHead1;
ListNode* p2 = pHead2;
if(len1 > len2)
{
int k = len1 - len2;
while(k)
{
p1 = p1->next;
-- k;
}
}
else
{
int k = len2 - len1;
while(k){
p2 = p2->next;
-- k;
}
}
while(p1)
{
if(p1 == p2)
return p1;
else
{
p1 = p1->next;
p2 = p2->next;
}
}
return p1;
}
int Findlen(ListNode* root)
{
int count = 0;
while(root)
{
++ count;
root = root->next;
}
return count;
}
};