160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
思路
计算出链表A和链表B的长度。得出两链表长度的差值gap。使长的一方链表向后移动gap次。
使两指针处于对应位置。
让两指针同时向后走,遇到相同节点就返回。
代码示例:
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB) {
struct ListNode* curA = headA;
struct ListNode* curB = headB;
//记录两个链表长度
int stepA = 0;
int stepB = 0;
while (curA)
{
stepA++;
curA = curA->next;
}
while (curB)
{
stepB++;
curB = curB->next;
}
//找到长链表和短链表
struct ListNode* longList = headA;
struct ListNode* shortList = headB;
if (stepB > stepA)
{
longList = headB;
shortList = headA;
}
//得到两链表距离差值
int gap = abs(stepA - stepB);
//让长链表和短链表对应长度相等
while (gap--)
{
longList = longList->next;
}
//遍历链表
while (longList)
{
//遇到同节点返回
if (longList == shortList)
{
return longList;
}
longList = longList->next;
shortList = shortList->next;
}
//遍历结束没相同节点,返回NULL
return NULL;
}