有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条
本博客探讨如何高效地合并k个已排序的链表。通过利用堆(priority_queue)的数据结构,可以在O(lgk)的时间复杂度内找到最小节点并将其添加到合并后的链表中。这种方法确保了合并后的链表依然有序。
467

被折叠的 条评论
为什么被折叠?



