剑指Offer——两个链表的第一个公共节点
两个链表的第一个公共节点
计算两个链表长度的解法
先用两个指针遍历两个链表计算出链表长度l1和l2,然后让长链表的指针从头先走abs(l1-l2)步,再一起往后走并判断两个指针是否相等,找到第一个相等的节点就是公共节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* p1=pHead1;
ListNode* p2=pHead2;
int l1=0, l2=0;
while(p1)
{
p1=p1->next;
l1++;
}
while(p2)
{
p2=p2->next;
l2++;
}
p1=pHead1;
p2=pHead2;
if(l1>l2)
{
for(int i=0;i<l1-l2;i++)
{
p1=p1->next;
}
}
else
{
for(int i=0;i<l2-l1;i++)
{
p2=p2->next;
}
}
while(p1 && p2 && p1!=p2)
{
p1=p1->next;
p2=p2->next;
}
return p1;
}
};
不计算链表长度的解法
对于A、B两个链表,把他们连接起来,变成AB和BA,然后用两个指针从头开始遍历,并判断两个指针是否相等,第一个相等的节点就是公共节点。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
ListNode* p1=pHead1;
ListNode* p2=pHead2;
while(p1!=p2)
{
p1=(p1==nullptr?pHead2:p1->next);
p2=(p2==nullptr?pHead1:p2->next);
}
return p1;
}
};