题目描述
给你两个单链表的头节点
headA
和headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null
。
示例:
![]()
输出:8
输出:2
解题思路:首先将两个链表遍历一遍,并且统计它们的长度,求出两个链表的长度差,让长的链表先走长度差步,然后两个链表一起走并判断它们的地址是否相等即可。
代码实现:
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
struct ListNode *tailA = headA;
struct ListNode *tailB = headB;
int lena = 1, lenb = 1;
while (tailA->next)
{
lena++;
tailA = tailA->next;
}
while (tailB->next)
{
lenb++;
tailB = tailB->next;
}
if(tailA != tailB)
{
return NULL;
}
//相交节点 长的先走差距步,然后两个同时走
struct ListNode *shortList = headA;
struct ListNode *longList = headB;
if(lena > lenb)
{
longList = headA;
shortList = headB;
}
int t = abs(lena - lenb);
while(t--)
{
longList = longList->next;
}
while(shortList && longList)
{
if(shortList == longList)
{
return shortList;
}
shortList = shortList->next;
longList = longList->next;
}
return NULL;
}