leetcode 23: Merge k Sorted Lists
2015-07-03 12:01
453 查看
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode* res=new ListNode(-1); ListNode* curr=res; vector<ListNode*> heap; heap.push_back(res); for(int i=0;i<lists.size();i++) if(lists[i]) heap.push_back(lists[i]); for(int i=(heap.size()-1)/2;i>0;i--) minheap(heap,i); while(heap.size()>1) { curr->next=heap[1]; curr=curr->next; if(heap[1]->next) heap[1]=heap[1]->next; else { swap(heap[1],heap[heap.size()-1]); heap.pop_back(); } minheap(heap,1); } return res->next; } void minheap(vector<ListNode*>& heap,int n) { if(n<1) return; int left=n<<1; int right=left+1; int mid=n; if(left<heap.size()&&heap[left]->val<heap[mid]->val) mid=left; if(right<heap.size()&&heap[right]->val<heap[mid]->val) mid=right; if(mid!=n) { swap(heap[mid],heap ); minheap(heap,mid); } } };
The following code uses the heap from STL.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeKLists(vector<ListNode*>& lists) {
vector<ListNode*> minHeap;
ListNode* dummyHead=new ListNode(0);
int size=lists.size();
for(int i=0;i<size;i++)
if(lists[i])
minHeap.push_back(lists[i]);
make_heap(minHeap.begin(),minHeap.end(),cmp);
ListNode* curr=dummyHead;
while(!minHeap.empty())
{
curr->next=new ListNode(minHeap[0]->val);
curr=curr->next;
pop_heap(minHeap.begin(),minHeap.end(),cmp);
minHeap.back()=minHeap.back()->next;
if(minHeap.back())
push_heap(minHeap.begin(),minHeap.end(),cmp);
else
minHeap.pop_back();
}
return dummyHead->next;
}
private:
static bool cmp(const ListNode* a,const ListNode* b)
{
return a->val>b->val;
}
};
相关文章推荐
- 【RAC】 RAC For W2K8R2 安装--卸载(八)
- tomcat8项目引入servlet-api.jar包后报错
- Objective-C 之 NSNotificationCenter vs delegate vs KVO
- informatica 在抽取EXCEL中遇到问题及INFA售后给出的建议
- iOS 笔试题
- 监听网络状态
- NSRange,判断字符串的各种操作~
- HDU 4508 沼泽湿地系列故事——记住减肥I (2013腾讯编程马拉松预赛第一)
- MySQL 求时间差
- leetcode 22: Generate Parentheses
- Android中保存图片的两种方式
- cocos2dx3.6 实现带光标的输入框(二);光标可移动
- java java web及tomcat的使用
- 使用css绘制六边形
- leetcode 21: Merge Two Sorted Lists
- Java时间比较
- javascript 十六进制与RGB颜色值的相互转换
- 车真的那么容易偷吗?汽车无线钥匙通信安全科普
- 测试测试能否贴代码
- centos 64位 安装 jdk 1.8