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个节点

LeetCode Algorithm 剑指 Offer 24. 反转链表

LeetCode Algorithm 剑指 Offer 57 - II. 和为s的连续正数序列