【问题标题】:error for size 2 list in merge K sorted List合并 K 排序列表中大小 2 列表的错误
【发布时间】:2019-12-11 23:12:10
【问题描述】:

我在 InterviewBit (Link) 上解决一个问题:https://www.interviewbit.com/problems/merge-k-sorted-lists/ 我必须合并 k 个排序的链表并将其作为一个排序列表返回。 这是我的解决方案:

 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
bool is(const ListNode& x, const ListNode& y) { return x.val < y.val; }
ListNode* Solution::mergeKLists(vector<ListNode*> &A) {
    vector<ListNode> m;
    for(int i=0;i<A.size();i++){
        while(A[i]!=NULL){
            m.push_back(*A[i]);
            A[i]=A[i]->next;
        }
    }
    sort(m.begin(),m.end(),is);
    ListNode* k =&m[0];
    for(int i=0;i<m.size()-1;i++){
        m[i].next=&m[i+1];
    }
    m[m.size()-1].next=NULL;
    return k;


}

您可以复制代码并检查任何自定义输入,它可以工作,但在仅提供大小为 2 的链接列表时返回错误列表,例如。 (1->2) 或例如 (1->2 and 3->4) 它分别返回 0->2 和 0->2->3->4 。 (我知道这有很差的时间复杂度)

【问题讨论】:

  • 算法是错误的。您似乎假设A 中的所有列表的长度都是一。但是,您的实际问题是什么?上面好像没有。
  • 它可以工作但返回错误的列表我认为这意味着它不起作用。您需要做的是一次从A 中删除一个节点(并以正确的顺序)并将它们放在一个新列表中。
  • 我是怎么假设的?我尝试了自定义输入 (1->2->3 , 2->5->6->7, 4->6->9) 它返回 1->2->2->3->4->5 ->6->6->7->9
  • 抱歉,我看错了代码。
  • 你基本上在做什么,它将所有节点组合到一个列表中,然后对其进行排序。那不是你应该做的。它完全没有抓住重点。仍然没有问题。

标签: c++ sorting vector linked-list stl


【解决方案1】:

您的代码的问题是您返回的列表包含指向已被破坏的节点的指针。所以你的代码有未定义的行为。

ListNode* Solution::mergeKLists(vector<ListNode*> &A) {
    vector<ListNode> m; // this vector contains the nodes of your merged list
    ...
    ListNode* k = &m[0]; // here you take a pointer to the content of m
    ...
        m[i].next = &m[i+1]; // here you make another pointer to the contents of m
    ...
    return k; // here you return that pointer
} // but here m is destroyed

所以最终结果是您返回一个指向向量的指针,该向量在函数退出时已被销毁。对该指针的任何后续使用都是未定义的行为。

【讨论】:

  • 我没有返回指向向量的指针,而是指向 ListNode 的指针,如头指针,它永远不会被破坏。k 存储第一个节点的地址,在 for 循环中我正在更新下一个指针每个节点的
  • ListNode 位于向量 m 中,向量 m 是函数的局部变量,您正在返回指向 m 内容的指针。但如果你不想相信我,那是你的决定。
  • 这可能就是为什么它适用于所有其他情况的原因
  • 未定义的行为(这就是你所拥有的)意味着事情是不可预测的。
  • 我并不是说你返回的是一个向量指针,而是一个指向向量内容的指针,特别是m[0]。当然,你所有的下一个指针也指向m 内容。因此,一旦 m 被销毁,所有这些指针都会变得无效,这在您退出函数时会发生。
猜你喜欢
  • 2019-03-20
  • 2018-05-02
  • 2011-05-17
  • 2013-10-28
  • 2018-05-16
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多