【问题标题】:Can't pass all test cases for LeetCode question to find intersection of two linked lists using Hash map无法通过 LeetCode 问题的所有测试用例来使用 Hash map 查找两个链表的交集
【发布时间】:2019-05-24 05:44:10
【问题描述】:

我通过了初始测试用例,但它显示了一个测试用例的错误答案。(测试用例中给出的链接列表:[0,9,1,2,4] 和 [3,2,4]。预期答案是值为 2 的节点,但我得到 4。)任何人都可以发现代码中的错误吗?

欢迎使用其他解决问题的方法,但我想用哈希图来做这件事以供我自己练习。

class Solution{
    public:
            ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
                    unordered_map<int, ListNode*> map;
                    int i=0;
                    while(headA!=NULL){ //inserting all nodes of LL A in hash map
                            map[i]=headA;
                            headA=headA->next;
                            i++;
                    }

                    while(1){
                            for (auto it = map.begin(); it != map.end(); it++) {
                                    if (it->second == headB){
                                            return it->second;
                                    }
                                    else{
                                            if(headB->next!=NULL) {
                                                    headB=headB->next;
                                            }
                                            else{
                                                    break;
                                            }
                                    }
                            }
                    }
                    return NULL;
            }
};

【问题讨论】:

标签: c++ linked-list hashtable unordered-map


【解决方案1】:

我想先说unordered_map 不保证存储顺序。这意味着项目不一定按照插入时的顺序存储。
我们看一下相关代码。

while(1){
      for (auto it = map.begin(); it != map.end(); it++) {
          if (it->second == headB){
              return it->second;
          }
          else{
              if(headB->next!=NULL) {
                  headB=headB->next;
              }
              else{
                  break;
              }
          }
} 

迭代器将以您根本无法预测的顺序循环遍历地图的存储顺序。粗略浏览一下您的代码,我可以看出您的程序将在以下两种情况之一中返回:

  • 如果迭代器通过映射的随机顺序恰好有 与对应的 headB 值对齐的值。
  • 如果headB 到达它的最后一个值但没有找到匹配项,while(1) 将重新启动内部 for 循环,并将迭代器指向的第一个值与headB 链表中的最后一个值进行比较。如果该比较成功,则程序将返回。否则,循环将永远持续下去。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多