k 개의 정렬 된 연결된 목록을 병합하고 하나의 정렬 된 목록으로 반환하는 "병합 K 목록"문제를 해결하기 위해 힙을 사용하려고합니다. 일반적으로 모든 목록 노드를 저장하고 비교를 위해 미리 정의 된 함수 LessThanLinkedList()를 사용하기 위해 최소 힙을 만듭니다. 하지만 62 행의 pop_heap() 연산과 75는 절대로 작동하지 않습니다. 미리 정의 된 비교 함수를 매개 변수로 사용했지만 힙의 맨 위는 제거되지 않습니다. 다음은 내 코드입니다. Visual Studio 2010을 IDE로 사용하고 있습니다. 그 이유는 누구나 아는가? 도와 주셔서 정말로 고맙습니다!C++ STL pop_heap이 작동하지 않습니다.
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <list>
#include <numeric>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
using namespace std;
class Solution {
public:
static bool LessThanLinkedList(const ListNode * l1, const ListNode * l2)
{
return(l1->val > l2->val);
}
ListNode *mergeKLists(vector<ListNode *> &lists) {
int idx;
bool ball_list_null;
ListNode * pNode;
ListNode *new_head;
ball_list_null = true;
for(idx = 0; idx < lists.size(); idx++)
{
if(NULL != lists[idx])
{
ball_list_null = false;
break;
}
}
if(true == ball_list_null)
return(NULL);
vector< ListNode* > list_heap;
for(idx = 0; idx < lists.size(); idx++)
{
if(NULL != lists[idx])
{
pNode = lists[idx];
while(NULL != pNode)
{
list_heap.push_back(pNode);
pNode = pNode->next;
}
}
}
make_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList);
if(list_heap.size() > 0)
{
new_head = list_heap[0];
pop_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList);//not work
}
if(list_heap.size() == 0)
{
new_head->next = NULL;
}
else
{
pNode = new_head;
while(list_heap.size() >0)
{
pNode->next = list_heap[0];
pop_heap(list_heap.begin(), list_heap.end(), LessThanLinkedList); // not work
pNode = pNode->next ;
}
pNode->next = NULL;
}
return(new_head);
}
};
void main()
{
Solution xpfsln;
ListNode *l1,*l2,*l3,*l4,*l5,*l6,*l7,*head;
l1 = new ListNode(1);
l2 = new ListNode(2);
l3 = new ListNode(3);
l1->next = l2;
l2->next = l3;
l3->next = NULL;
vector<ListNode *> list_vec;
list_vec.push_back(l1);
head = xpfsln.mergeKLists(list_vec);
}
감사합니다. 매우 귀중한 답변입니다. 원래 스택 팝 기능과 같지 않은 것 같습니다. 디자인 기능을 이해할 수는 있지만 일관성이 없습니다. – flashstar