1. 程式人生 > 實用技巧 >合併\ k k 個已排序的連結串列並將其作為一個已排序的連結串列

合併\ k k 個已排序的連結串列並將其作為一個已排序的連結串列

題目描述
合併\ k k 個已排序的連結串列並將其作為一個已排序的連結串列返回。分析並描述其複雜度。
示例1
輸入
複製
[{1,2,3},{4,5,6,7}]
返回值
複製
{1,2,3,4,5,6,7}
說明:本題目包含複雜資料結構ListNode,點此檢視相關資訊

/**
 * 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 fake(0);
        ListNode *cur = &fake;
        vector<ListNode *> vec;
        int n = lists.size();
        for (int i=0;i< n;++i) {
            if (lists[i]) vec.push_back(lists[i]);
        }
        make_heap(vec.begin(), vec.end(),cmp);
        while (vec.size()) {
            cur -> next = vec.front();
            pop_heap(vec.begin(),vec.end(),cmp); // 將first 和 n-1 進行交換
            vec.pop_back();
            cur = cur -> next;
            if (cur -> next) {
                vec.push_back(cur->next);
                push_heap(vec.begin(),vec.end(),cmp);
            }
            
        }
        return fake.next;
    }
    
    static bool cmp(ListNode* l1, ListNode* l2) {
        return l1-> val > l2->val;
    }
};