![](https://i-blog.csdnimg.cn/blog_migrate/23568648f4cc4a79cb00baf444693ea8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6ceb43a300750cf27e8231e35430ee83.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bb23bac9bcdb30c04ad679989e9e4b4f.png)
思路
简化下问题,如果两个链表等长,那么我们只需要同时遍历两个链表,比较每个节点的地址是否相同就可以。
如果两个链表不等长,我们先遍历两个链表,计算出它们的长度以及较长链表比较短链表多出来的长度gap,然后让较长链表的指针先走多出来的长度步,接着两个链表的指针同时向后遍历,直到找到它们的第一个公共节点。
当然两者的思路可以合并。
如果没有公共节点,则返回 null。
代码
可以参考下面示例一
![](https://i-blog.csdnimg.cn/blog_migrate/07b0c75aee00d96334f5dcb32e8dfd6d.png)
class Solution {
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB)
{
//1.有空链表就返回
if (!headA || !headB)
return nullptr;
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0;
int lenB = 0;
//2.计算A链表的长度
while (curA != nullptr)
{
++lenA;
curA = curA->next;
}
//3.计算B链表的长度
while (curB != nullptr)
{
++lenB;
curB = curB->next;
}
//4.将指针回复初始位置
curA = headA;
curB = headB;
//5.我们始终令curA指向较长链表的首地址
if (lenB > lenA)
{
swap(curA, curB);
swap(lenA, lenB);
}
int gap = lenA - lenB;
//6.让长的链表指针先走gap步
while (gap--)
{
curA = curA->next;
}
//7.比较节点,判断是否相交
while (curA != nullptr)
{
if (curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
reurn nullptr;
}
};