(1)问题
力扣——面试题 02.07. 链表相交 - 力扣(LeetCode)
给你两个单链表的头节点 headA
和 headB
,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null
。
图示两个链表在节点 c1
开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Intersected at '8' 解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。 从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。 在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
(2)思路
找两个链表的相交节点,两个链表的长度不同,但如果两个链表相交,相交部分长度却是相同的。因此,可以将两个链表的头节点移动到相同的位置(找到长链表,移动长链表直到与短链表长度相同),然后同时往后移动,如果相交,两个节点的地址就相等,返回该节点即可。如果不相交,最后返回nullptr。
(3)解题流程
1.计算两个链表的长度。封装为一个函数,输入头节点,返回长度。
2.创建遍历的节点curA = headA,curB = headB;
3.找到较长的链表,然后移动到与短链表相同的位置。
4.同时移动两个节点,如果存在节点相同(这里是判断地址,不是判断它们存储的值和指针),直接返回该节点。
5.循环节点,最后返回nullptr。
代码实现:
int getlenght(ListNode* head)
{
if(head==nullptr) return 0;
int size = 1;
while(head->next!=nullptr)
{
head = head->next;
size++;
}
return size;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA = headA;
ListNode* curB = headB;
int lengthA = getlenght(headA);
int lengthB = getlenght(headB);
if(lengthA>lengthB)
{
int n = lengthA-lengthB;
while(n--)
{
curA = curA->next;
}
}
else
{
int m = lengthB-lengthA;
while(m--)
{
curB = curB->next;
}
}
while(curA&&curB)
{
if(curA==curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return nullptr;
}