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之路的主要内容,如果未能解决你的问题,请参考以下文章