题目描述

方法一:
思路描述:最简单的方法是遍历两个链表,存储每个节点,然后发现是否有相同的节点,如果有则返回该节点。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
unordered_map<ListNode*, int> nodes;
ListNode* h1 = headA, *h2 = headB;
while(h1){
nodes[h1] = 1;
h1 = h1->next;
}
while(h2){
if(nodes[h2]) return h2;
h2 = h2->next;
}
return NULL;
}
};
方法二:
是不是一定存在 A 的长度加上相交前 B 的长度 = B 的长度加上相交前 A 的长度,所以我们可以用两个指针分别指向 A 和 B,当到达末尾时指向另一个链表的开头,相遇的时候一定是交点,如果不相遇那么说明这两个链表不相交。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* h1 = headA, *h2 = headB;
while (h1 != h2) {
if(h1) h1 = h1->next;
else h1 = headB;
if(h2) h2 = h2->next;
else h2 = headA;
}
return h1;
}
};

本文介绍两种查找链表交点的有效方法。方法一利用哈希表存储节点,检查是否出现重复节点。方法二采用双指针技巧,两指针分别从两个链表头开始,遇到链表末尾转向另一链表,相遇点即为交点,若不相遇则无交点。
909

被折叠的 条评论
为什么被折叠?



