【发布时间】: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