1、题目:链表相交
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
2、解题思路
两个链表从某个位置开始他们具有重复的部分一直到两个链表结束,所以第一个想法就是从最后一个开始判断,由于链表只能从前往后遍历,所以我们可以找出两个链表长度的差值,然后让两个链表末尾对其,然后从短的链表头指针开始一一对比每个数据,如果是不相等的,则重新设置两个头结点。
3、代码
class Solution
{
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
{
ListNode* curA = headA;
ListNode* curB = headB;
int lenA = 0, lenB = 0;
while (curA != NULL)
{ // 求链表A的长度
lenA++;
curA = curA->next;
}
while (curB != NULL)
{ // 求链表B的长度
lenB++;
curB = curB->next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if (lenB > lenA)
{
swap (lenA, lenB);
swap (curA, curB);
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap--)
{
curA = curA->next;
}
// 遍历curA 和 curB,遇到相同则直接返回
while (curA != NULL)
{
if (curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};