LeetCode Algorithm 剑指 Offer 52. 两个链表的第一个公共节点
Posted Alex_996
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Algorithm 剑指 Offer 52. 两个链表的第一个公共节点相关的知识,希望对你有一定的参考价值。
题目链接:剑指 Offer 52. 两个链表的第一个公共节点
Ideas
算法:双指针+数学
数据结构:链表
思路:这道题我记得在左神算法初级班的时候讲过,有点忘记了,做法是两个指针都往前走,如果pa到头了就挪到pb,如果pb到头了就挪到pa,最后肯定会相遇,但是为什么会相遇的证明有点忘记了。我这里提供的算法是双指针加上一点点数学。
首先考虑边界情况,如果两个指针中有一个为空,那么肯定没有相交的节点,直接
return nullptr
就OK了。
然后需要计算出两个链表的长度lenA和lenB以及长度差diff,然后需要重新定义一下,让A表示长链表,B表示短链表。
如果两个链表有相交的部分,那么长出来的一块肯定是在不相交的那一部分,因为转换完了之后A比较长,所以指向A的指针可以先走diff步,然后两个指针再一起走,如果相等了,那就说明找到了第一个相交的节点,否则说明两个链表没有相交的部分。
Code
C++
class Solution
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB)
if (headA == nullptr || headB == nullptr)
return nullptr;
int lenA = 0, lenB = 0;
ListNode *pA = headA, *pB = headB;
while (pA != nullptr)
lenA++;
pA = pA->next;
while (pB != nullptr)
lenB++;
pB = pB->next;
int diff = abs(lenA - lenB);
// 如果链表B的长度大于链表A的长度,交换A、B
if (lenB > lenA)
pA = headA;
headA = headB;
headB = pA;
// headA先走diff步
for (int i = 0; i < diff; i++)
headA = headA->next;
while (headA != nullptr)
if (headA == headB)
return headA;
else
headA = headA->next;
headB = headB->next;
return nullptr;
;
以上是关于LeetCode Algorithm 剑指 Offer 52. 两个链表的第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode Algorithm 剑指 Offer 24. 反转链表
LeetCode Algorithm 剑指 Offer 18. 删除链表的节点
LeetCode Algorithm 剑指 Offer 06. 从尾到头打印链表
LeetCode Algorithm 剑指 Offer 22. 链表中倒数第k个节点