题目
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
解题思路
要看两个链表是否相交,首先要实现两个链表的尾部对齐,先要求出两个链表的长度,求出长度差并将较长的链表移位这个长度差,以保证两个链表在同一起点,之后两链表同时右移直到发现相同指针或者到null返回结果
以下是代码
#include<iostream>
//求链表长度后对齐处理
struct ListNode
{
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
class Solution
{
public:
ListNode* getIntersectionNode(ListNode* headA, ListNode* headB)
{
ListNode* dummyHead1 = headA;
ListNode* dummyHead2 = headB;
int lenA = 0, lenB = 0;
//求出俩连边长度
while (dummyHead1 != nullptr)
{
dummyHead1 = dummyHead1->next;
++lenA;
}
while (dummyHead2 != nullptr)
{
dummyHead2 = dummyHead2->next;
++lenB;
}
dummyHead1 = headA;
dummyHead2 = headB;
//交换俩长度和指针保证A是长的
if (lenB > lenA)
{
std::swap(lenA, lenB);
std::swap(dummyHead1, dummyHead2);
}
int len = lenA - lenB;
//保证俩链表在一个起点位置上
while (len--)
{
dummyHead1 = dummyHead1->next;
}
while (dummyHead1 != nullptr)
{
if (dummyHead1 == dummyHead2)
{
return dummyHead1;
}
dummyHead1 = dummyHead1->next;
dummyHead2 = dummyHead2->next;
}
return nullptr;
}
};