题目描述
输入两个链表,找出它们的第一个公共结点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
//思路:
//如果两个链表有公共结点,那么两个第一个公共结点后面的结点都是相同的,若链表1的长度比链表2的长度大len,
//则需要将链表1起始结点向后移动len个长度,确保两个链表初始比较结点后面的长度是一样的。
//链表的初始化其实就是链表的创建的过程,它的初始化其实和变量、
//指针的初始化一样,如果你定义了一个指针,而没有对其进行初始化,
//这个指针就是一个“野指针”,指向一块垃圾内存,这是很危险的,
//链表的初始化就是为了让程序员能够获取链表的首地址,然后对其进行插入、删除、排序等操作了!
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
int len,len1,len2;
ListNode* res=NULL; //初始化一个链表让其为空
if(pHead1==NULL||pHead2==NULL) //若两个链表有一个为空,则返回空链表res
return res;
ListNode* pNode1=pHead1; //这里很重要,计算原始两个链表的长度时,不能在原始的结点上操作
ListNode* pNode2=pHead2;
while(pNode1!=NULL) //计算pHead1的长度
{
++len1;
pNode1=pNode1->next;
}
while(pNode2!=NULL) //计算pHead2的长度
{ ++len2;
pNode2=pNode2->next;
}
len=(len1>len2)?(len1-len2):(len2-len1); //pHead1与pHead2的长度差len
if(len1>len2) //这里的意思是,如果pHead1的长度大于pHead2的长度,将pHead1往后移动len
{
for(int i=0;i<len;i++)
pHead1=pHead1->next;
}
else //如果pHead2的长度大于pHead1的长度,将pHead2往后移动len
{
for(int i=0;i<len;i++)
pHead2=pHead2->next;
}
while(pHead1!=NULL&&pHead2!=NULL)
{
if(pHead1->val!=pHead2->val) //不相等,pHead1和pHead2分别往后移动一个长度
{
pHead1=pHead1->next;
pHead2=pHead2->next;
}
else //相等,将结果赋给res,并结束while循环
{
res=pHead1;
break;
}
}
return res;
}
};