合并K个有序链表-堆的使用

有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 &lists) {
    ListNode* plist=NULL;
    priority_queue,cmp> q;
	int i,j;
	if(lists.size()>0){
		for(i=0;inext;
				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.csdn.net/zhu_liangwei/article/details/8204906第7条

你可能感兴趣的:(合并K个有序链表-堆的使用)