两个链表的第一个公共节点
OJ地址:两个链表的第一个公共节点
【解题思路】
- 题目要求是单链表,所以如果有交点,则最后一个链表的节点地址一定是相同的
- 求第一公共节点,本质是让长的链表先走abs(length1-length2)步,后面大家的步调一致,往后找第一个地址相同的节点,就是题目要求的节点
- 所以需要各自遍历两次链表
ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
if(pHead1 == nullptr || pHead2 == nullptr)
return nullptr;
int len1, len2;
len1 = len2 = 0;
ListNode *p1, *p2;
p1 = pHead1;
p2 = pHead2;
while(p1)
{
++len1; //求出pHead1的长度
p1 = p1->next;
}
while(p2)
{
++len2;//求出pHead2的长度
p2 = p2->next;
}
if(p1 != p2) //如果两个链表的最后一个节点不同,表示没有交点
return nullptr;
ListNode *longer, *shorter;
longer = pHead1;
shorter = pHead2;
if(len1 < len2)
swap(longer, shorter);
int k = abs(len1 - len2);
while(k--)
{
longer = longer->next;
}
while(longer != shorter)
{
longer = longer->next;
shorter = shorter->next;
}
return shorter;
}