相交链表
一、题目
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
二、思路分析
🍀可以发现:
-
🍀先判断链表是否相交,链表如果相交,最后一个节点必然相同
🍁🍁
这里注意不仅仅是节点的值相同,更重要的是节点的地址相同
🍁🍁 -
🍀在判断是否相交的时候记录两个链表的长度,
求出差值
-
🍀这样我们就能让两个链表从同一起点出发
直到地址相同,则为交点
🌺这里有个绝对值
的问题:
使用的是abs
函数,包含头文件math.h
即可
但判断谁先开始的时候
int adv = abs(countA - countB);
if(countA > countB)
{
while(adv--)
{
curA = curA->next;
}
}
else
{
while(adv--)
{
curB = curB->next;
}
}
🍂🍂可以不必这么繁琐,先假设A长,B短,如果不对,就交换它们的值🍂🍂
🍄代码如下:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
struct ListNode * curA = headA;
struct ListNode * curB = headB;
int countA = 1;
int countB = 1;
while(curA->next)
{
curA = curA->next;
countA++;
}
while(curB->next)
{
curB = curB->next;
countB++;
}
if(curA != curB)
{
return NULL;
}
struct ListNode * longlist = headA;
struct ListNode * shortlist = headB;
int gap = abs(countA - countB);
if(countA < countB)
{
longlist = headB;
shortlist = headA;
}
while(gap--)
{
longlist = longlist->next;
}
while(longlist != shortlist)
{
longlist = longlist->next;
shortlist = shortlist->next;
}
return longlist;
}