LeetCode 160 相交链表[哈希表 双指针] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 160 相交链表[哈希表 双指针] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述在这里插入图片描述在这里插入图片描述解题思路:
哈希表存储链表中的节点,value为个数,当个数大于1,说明有相交部分,代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        unordered_map<ListNode*, int> count;
        // 统计headA每个节点的个数
        while(headA != nullptr) {
            count[headA] ++;
            headA = headA -> next;
        }
        // 统计headB每个节点的个数
        while(headB != nullptr) {
            count[headB] ++;
            // 如果等于2,说明相交
            if(count[headB] == 2) {
                return headB;
            }
            headB = headB -> next;
        }
        return NULL;
    }
};

相对来说,双指针的方法会更加高效一点,如果headA和headB不相交部分长度相同,那么遍历下去会在相交节点相遇,如果不同的话需要推理一波,假设A长度m,B长度n,m < n,m = a + c,n = b + c,A遍历到头会从B开始遍历,到第一个相交节点遍历距离为 a + c + b,同理B遍历的距离为 a + c + b,也就是他们还是会在相交节点相遇!代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        ListNode *pA = headA, *pB = headB;
        while (pA != pB) {
            pA = pA == nullptr ? headB : pA->next;
            pB = pB == nullptr ? headA : pB->next;
        }
        return pA;
    }
};


以上是关于LeetCode 160 相交链表[哈希表 双指针] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

160. 相交链表简单哈希双指针

160. 相交链表简单哈希双指针

LeetCode题解160_相交链表

力扣160. 相交链表 哈希双指针差值法栈四种花式解法

leetcode No160 相交链表 java

160. 相交链表