😾 博客主页: 爱吃bug的猿
🚀博客专栏: 数据结构,C语言初阶进阶全流程讲解
✨ 每日激励:欲达高峰,必忍其痛;欲戴王冠,必承其重✨
😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新
1.代码思路
- 此题要求我们找相交节点,找不到就返回空指针
- 注意链表相交后,相交点的next指向的位置只有一个,所以后面的节点地址是一样的,相当于“重合”
- 1.因为两个链表长度不同,那我们是否可以考虑计算两个链表长度,计算两者距离差,让长链表先走距离差,这样就可以控制两个链表长度相等了
- 2.接着让用两个指针分别指向链表,让它们向后遍历,判断它们的位置是否相等,相等则找到了相交节点
- 3.倘若两个链表不相交,我们可以判断两个链表的尾部是否相等,如果连尾部都不相等,那么不可能相交
2.误区
- 大家有没有想过这样一个思路
- 将两个链表进行翻转,然后我再进行遍历就能找到相交节点了
- 很遗憾,这种方法是错的
- 上面图片红色表示翻转第一个链表,蓝色表示翻转第二个链表
- 结果让人大跌眼镜,理想很美好,现实很骨感,根本就翻转不过去,而且c1不可能既指向b3又指向a2
3.代码实现
法1
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * pheadA = headA;
struct ListNode * pheadB = headB;
int longheadA = 1;
int longheadB = 1;
while(pheadA->next)
{
pheadA = pheadA->next;
longheadA++;
}
while(pheadB->next)
{
pheadB = pheadB->next;
longheadB++;
}
if(pheadA != pheadB)
{
return NULL;
}
struct ListNode * longNode = longheadA>=longheadB?headA:headB;
struct ListNode * shortNode = longheadA<longheadB?headA:headB;
int gap = abs(longheadA - longheadB);
while(gap--)
{
longNode = longNode->next;
}
while(longNode != shortNode)
{
longNode = longNode->next;
shortNode = shortNode->next;
}
return shortNode;
}
法2
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * pheadA = headA;
struct ListNode * pheadB = headB;
int longheadA = 1;
int longheadB = 1;
while(pheadA->next)
{
pheadA = pheadA->next;
longheadA++;
}
while(pheadB->next)
{
pheadB = pheadB->next;
longheadB++;
}
if(pheadA != pheadB)
{
return NULL;
}
struct ListNode * longNode = headA;
struct ListNode * shortNode = headB;
if(longheadA < longheadB)
{
longNode = headB;
shortNode = headA;
}
int gap = abs(longheadA - longheadB);
while(gap--)
{
longNode = longNode->next;
}
while(longNode != shortNode)
{
longNode = longNode->next;
shortNode = shortNode->next;
}
return shortNode;
}
注:abs是用来求绝对值的函数