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. 两个链表的第一个公共节点的主要内容,如果未能解决你的问题,请参考以下文章