由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - [leetcode] merge k lists 求助
相关主题
给一个最大堆,求最大的K个数,O(K) 算法?C++里如何将一个vector转换成priority_queue
one C++ question关于priority_queue一问
heap里面delete一个非root的节点请教各位大牛一个K-way merge 的问题
heap&stack Linux vs. Windows  (转载)问一个merge K sorted list的时间复杂度
C++ Q76: singly linked list -- 这个逆序打印有什么错?这题怎么做?
How to find the size of an array? Thanks.leetcode上的sorted list to BST
2道算法题。 求教大家![BSSD]回国一趟回来做题很难进入状态了,顺便问下那个Merge k Sorted
srand()的问题请大家 看看这个 Merge k Sorted Lists (Java), 我不太明白
相关话题的讨论汇总
话题: listnode话题: heap话题: heapifying话题: extracting话题: printlist
进入JobHunting版参与讨论
1 (共1页)
s*w
发帖数: 729
1
不知道为啥,我的 heap 时灵时不灵的?请看下面的 code 和输出显示
#include
#include
#include
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int v):val(v),next(NULL) {}
};
bool minHeapPredicate(ListNode* lhs,ListNode* rhs) {
return lhs->val > rhs->val;
}
class Solution {
public:
ListNode *mergeKLists(vector lists) {
ListNode *retHead = NULL, *retTail = NULL;
// store values and nodes into heap
vector heads;
for(int i = 0;i < lists.size();++i)
if(lists[i])
heads.push_back(lists[i]);
make_heap(heads.begin(),heads.end(),minHeapPredicate);

// loop through all elements
while(!heads.empty()) {
// extract the min from heap
pop_heap(heads.begin(),heads.end());
ListNode* tmp = heads.back();
heads.pop_back();

// update the list pointer
ListNode *tmp2 = tmp->next;
if(tmp2) {
heads.push_back(tmp2);

cout << "before heapifying, the heap has: ";
for(int i=0;i cout << heads[i]->val << " ";
cout << endl;

push_heap(heads.begin(),heads.end(),minHeapPredicate);

cout << "after heapifying, the heap has: ";
for(int i=0;i cout << heads[i]->val << " ";
cout << endl;
}
// store tmp to ret
cout << "tmp=" << tmp->val << endl;
tmp->next = NULL;
if(retHead == NULL) {
retHead = tmp;
retTail = tmp;
} else {
retTail->next = tmp;
retTail = tmp;
}
}

return retHead;
}
};
void printList(ListNode *p) {
while(p) {
cout << p->val << "->";
p = p->next;
}
cout << endl;
}
int main() {
ListNode *p1 = new ListNode(-1);
ListNode *p2 = new ListNode(1);
p1->next = p2;
ListNode *p4 = new ListNode(-3);
ListNode *p5 = new ListNode(1);
ListNode *p6 = new ListNode(4);
p4->next = p5;
p5->next = p6;
ListNode *p7 = new ListNode(-2);
ListNode *p8 = new ListNode(-1);
ListNode *p9 = new ListNode(0);
ListNode *p10 = new ListNode(2);
p7->next = p8;
p8->next = p9;
p9->next = p10;
printList(p1);
printList(p4);
printList(p7);
vector vl;
vl.push_back(p1);
vl.push_back(p4);
vl.push_back(p7);
Solution s;
ListNode *ret = s.mergeKLists(vl);

printList(p1);
printList(p4);
printList(p7);
printList(ret);
}
outputs as follows:
-1->1->
-3->1->4->
-2->-1->0->2->
-3->1->4->
-1->1->
-2->-1->0->2->
now extracting min from heap: -3
before heapifying, the heap has: -2 -1 1
after heapifying, the heap has: -2 -1 1
-2->-1->0->2->
-1->1->
1->4->
now extracting min from heap: -2
before heapifying, the heap has: 1 -1 -1
after heapifying, the heap has: -1 -1 1
-1->0->2->
-1->1->
1->4->
now extracting min from heap: -1
before heapifying, the heap has: 1 -1 0
after heapifying, the heap has: 0 -1 1
0->2->
-1->1->
1->4->
now extracting min from heap: 0
before heapifying, the heap has: 1 -1 2
after heapifying, the heap has: 1 -1 2
1->4->
-1->1->
2->
now extracting min from heap: 1
before heapifying, the heap has: 2 -1 4
after heapifying, the heap has: 2 -1 4
2->
-1->1->
4->
now extracting min from heap: 2
4->
-1->1->
now extracting min from heap: 4
-1->1->
now extracting min from heap: -1
before heapifying, the heap has: 1
after heapifying, the heap has: 1
1->
now extracting min from heap: 1
-1->1->
-3->-2->-1->0->1->2->4->-1->1->
-2->-1->0->1->2->4->-1->1->
-3->-2->-1->0->1->2->4->-1->1->
s*w
发帖数: 729
2
tnnd, 搞了几个小时终于发现问题了, pop_heap 也要加同一个 compare 的

【在 s*w 的大作中提到】
: 不知道为啥,我的 heap 时灵时不灵的?请看下面的 code 和输出显示
: #include
: #include
: #include
: using namespace std;
: struct ListNode {
: int val;
: ListNode *next;
: ListNode(int v):val(v),next(NULL) {}
: };

p***y
发帖数: 637
3
堆应该单独实现,测试好后再用



【在 s*w 的大作中提到】
: 不知道为啥,我的 heap 时灵时不灵的?请看下面的 code 和输出显示
: #include
: #include
: #include
: using namespace std;
: struct ListNode {
: int val;
: ListNode *next;
: ListNode(int v):val(v),next(NULL) {}
: };

s*w
发帖数: 729
4
面试编程的时候自己实现一个 heap ? 光写这个 heap 至少要20分钟吧?

【在 p***y 的大作中提到】
: 堆应该单独实现,测试好后再用
:
:

l*****a
发帖数: 14598
5
所以用JAVA
直接用PriorityQueue

【在 s*w 的大作中提到】
: 面试编程的时候自己实现一个 heap ? 光写这个 heap 至少要20分钟吧?
a**********t
发帖数: 14
6
http://weibo.com/3948019741/BtWze3heV
这是不错的一个解 而且有解释 可以看看。
s***k
发帖数: 50
7
C++也有priority_queue的好不好,又不是java独有的,
还有,本题不用heap也能解,分治。。。
1 (共1页)
进入JobHunting版参与讨论
相关主题
请大家 看看这个 Merge k Sorted Lists (Java), 我不太明白C++ Q76: singly linked list -- 这个逆序打印有什么错?
约瑟夫问题 用循环链表算法 时间 复杂度多少How to find the size of an array? Thanks.
Tricky Pointer Problems -- Which level are you?2道算法题。 求教大家!
请教几个面试问题srand()的问题
给一个最大堆,求最大的K个数,O(K) 算法?C++里如何将一个vector转换成priority_queue
one C++ question关于priority_queue一问
heap里面delete一个非root的节点请教各位大牛一个K-way merge 的问题
heap&stack Linux vs. Windows  (转载)问一个merge K sorted list的时间复杂度
相关话题的讨论汇总
话题: listnode话题: heap话题: heapifying话题: extracting话题: printlist