题目:编写一个程序,找到两个单链表相交的起始节点。
暴力解法:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode *pa=headA;
while(pa){
ListNode *pb=headB;
while(pb){
if(pa==pb){
return pa;
}else{
pb=pb->next;
}
}
pa=pa->next;
}
return NULL;
}
};
哈希表法:
遍历链表 A 并将每个结点的地址/引用存储在哈希表中。然后检查链表 B 中的每一个结点
是否在哈希表中。若在,则 b为相交结点。时间复杂度 : O(m+n)O(m+n)。空间复杂度 : O(m)O(m) 或 O(n)O(n)。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
std::unordered_set<ListNode*> set;
ListNode *pa=headA;
while(pa){
set.insert(pa);
pa=pa->next;
}
ListNode *pb=headB;
while(pb){
if(set.find(pb)!=set.end()) //找到了
{
return pb;
}
pb=pb->next;
}
return NULL;
}
};
知识点: https://blog.csdn.net/qq_38790716/article/details/84719271(hash_set)