23.合并k个有序表
2017-07-10 15:35
183 查看
Merge k Sorted Lists
问题描述:
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.知识补充:
删除vector中的元素lists.erase(lists.begin()+i);//删除第i个位置的元素,注意此时vector动态改变,即此时i+1位置的元素变为现在的i位置 lists.erase(lists.begin()+i,lists.begin()+j);//删除区间[i,j)的元素
优先级队列
priority_queue<Type, Container, Functional> priQ;//Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。 priQ.push();//元素加入队列 priQ.top();//返回队列头部数据 priQ.pop();//队列头部数据出队 priQ.empty();//判断队列是否为空 priQ.size();//返回队列中数据的个数
测试代码:
ListNode* mergeKLists(vector<ListNode*>& lists) { int i=0,pos = 0; if(lists.empty()) return NULL; while(i<lists.size()) { if(!lists[i]) { lists.erase(lists.begin()+i); continue; } i++; } ListNode *p=lists[0]; ListNode dummy(INT_MIN); ListNode *tail = &dummy; while(!lists.empty()) { i = 0; p = lists[0]; pos = 0; while(i<lists.size()) { if(lists[i]->val<p->val) { p = lists[i]; pos = i; } i++; } tail->next = p; tail = tail->next; if(p->next) { p = p->next; lists[pos] = p; }else { lists.erase(lists.begin()+pos); } } return dummy.next; }
性能:
参考答案:
class Solution { public: // Need to use > because we want priority queue to return the min priority first struct priQueueCmp { bool operator() (const ListNode* l, const ListNode* r) { return l->val > r->val; } }; ListNode* mergeKLists(vector<ListNode*>& lists) { // Using priority queue to pick out min of the lists at each step. // Pri queue picks out the min in const time, but insertion and deletion takes // log time priority_queue<ListNode*, vector<ListNode*>, priQueueCmp> priQ; ListNode* head = NULL; ListNode* lastNode = NULL; // load up for(int i = 0; i < lists.size(); ++i) { if(lists[i] != NULL) priQ.push(lists[i]); } if(priQ.empty()) return head; head = priQ.top(); lastNode = head; priQ.pop(); if(head->next != NULL) priQ.push(head->next); while(!priQ.empty()) { ListNode* minNode = priQ.top(); lastNode->next = minNode; lastNode = minNode; priQ.pop(); if(minNode->next != NULL) priQ.push(minNode->next); } return head; } };
性能:
相关文章推荐
- leetcode_效率题解_23. Merge k Sorted Lists(合并k个有序链表)
- Leet Code 23 Merge k Sorted Lists - 合并K个有序链表 Java
- LeetCode 23 Merge k Sorted Lists(合并k个有序链表)
- [LeetCode23]Merge k Sorted Lists(合并k个有序链表)
- leetcode23 合并K个元素的有序链表
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
- LeetCode 23. Merge k Sorted Lists(合并k个有序单链表)
- leetcode解题之23.Merge k Sorted Lists Java版本(合并k个有序的链表)
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- 合并k个有序链表 Merge k Sorted Lists
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- 合并K个有序数组(假设每个数组长度相等)
- LeetCode OJ 之 Merge k Sorted Lists(合并k个有序链表)
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- 【算法】合并k个有序的链表-基于最小堆的思想
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表头文件C语言
- O(N lgK) 时间内合并K个有序链表
- 算法导论第三版第六章 合并K个有序链表的三种解法(最小堆法和分治递归法)
- K个有序链表共N个结点在O(NlgK)时间合并为一个新的有序链表实现文件C语言
- 链表面试题(二):冒泡排序、合并两个有序链表、查找中间节点、查找倒数K个节点