示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6方法一:分治合并
ListNode* mergeKLists(vector<ListNode*>& lists) { //分治合并 递归 ListNode* head = merge(lists, 0, lists.size()-1); return head; } ListNode* merge(vector<ListNode*>&lists, int l, int r) { if(l == r) { return lists[l]; } if(l > r) { return nullptr; } int mid = (l+r)>>1; return mergetwo(merge(lists, l, mid), merge(lists, mid+1, r)); } ListNode* mergetwo(ListNode* l, ListNode* r) { if(!l || !r) { return l ? l : r; } ListNode head(0); ListNode* tail = &head; ListNode* a = l; ListNode* b = r; while(a&&b) { if(a->val > b->val) { tail->next = b; tail = tail->next; b = b->next; } else { tail->next = a; tail = tail->next; a = a->next; } } tail->next = a ? a : b; return head.next; }方法二:使用优先对列,每层的最小值,中找最小的取出。
// struct VecNode{ // int val; // ListNode * p; // bool operator < (const VecNode& rhs) const { // return val > rhs.val; //小根堆 // } // }; // ListNode* mergeKLists(vector<ListNode*>& lists) { // //使用优先队列来合并 // priority_queue<VecNode> que; // for(int i = 0; i < lists.size(); ++i) // { // if(lists[i]) // que.push({lists[i]->val, lists[i]}); // } // ListNode head(0); // ListNode * tail = &head; // while(!que.empty()) // { // // cout << "s"<<endl; // auto p = que.top(); // que.pop(); // tail->next = p.p; // tail = tail->next; // if(p.p->next) // { // que.push({p.p->next->val, p.p->next}); // } // } // return head.next; // }