有k个有序的链表(按照结点的val
值升序),请将它们全部合并为一个新的有序的链表。返回合并后链表的头结点。
题目来源:http://www.itint5.com/oj/#21
推荐指数:※※
K个链表本来都是有序的,现在要将K个链表合并成一个。
关键在于k个链表元素之间的比较。
例如:k个链表的第一个元素比较之后,将最小的那个节点X放入新的链表当中。X=X->next; 现在就是要高效的将X加入到上次的结果当中。很容易知道,heap可以在O(lgk)时间里完成。
使用C++的priority_queue,它本身就是一个堆的结构。
typedef struct ListNode {
int val;
ListNode *next;
}ListNode;
//lists包含k个链表的头结点,返回合并后链表头结点
struct cmp{
bool operator()(ListNode * a, ListNode * b){
return a->val>b->val;
}
};
ListNode* merge(vector<ListNode*> &lists) {
ListNode* plist=NULL;
priority_queue<ListNode*,vector<ListNode* >,cmp> q;
int i,j;
if(lists.size()>0){
for(i=0;i<lists.size();i++){
if(lists[i]!=NULL)
q.push(lists[i]);
}
if(!q.empty()){
plist=q.top();
q.pop();
ListNode *nlist=plist;
ListNode *tmp_node=nlist;
if(tmp_node!=NULL){
tmp_node=tmp_node->next;
if(tmp_node!=NULL)
q.push(tmp_node);
}
while(!q.empty()){
ListNode *tmp_node=q.top();
q.pop();
nlist->next=tmp_node;
nlist=nlist->next;
if(tmp_node!=NULL){
tmp_node=tmp_node->next;
if(tmp_node!=NULL)
q.push(tmp_node);
}
}
}
}
return plist;
}
堆的实现可以看: http://blog.youkuaiyun.com/zhu_liangwei/article/details/8204906第7条