LeetCode | 23.マージkのソートされたリストの合併kは(C ++)の配列を命じました

タイトル説明(難易度)

原题链接
マージkはリンクリストをソートし、ソートされたリスト1のようにそれを返します。その複雑さを分析し、説明します。

例:

Input:
[
  1->4->5,
  1->3->4,
  2->6
]
Output: 1->1->2->3->4->4->5->6

アルゴリズム

(分割統治) O ( m l o g n ) O(mlogn)

N = 6、合わせ0-31-42-5:分割統治アルゴリズムは、例えば、使用して
二つのリンクされたリストをソートマージ実装する前に行われてきました

時間の複雑さがあります O ( m l o g n ) O(mlogn) :N-リスト数であり、mは二つのリスト内のノードの最大数であります

C ++コード

/**
 * 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) {
        // Divide and Conquer Approach
        // odd:  n = 5   0-3 1-4 2        k = (n + 1) / 2
        // even: n = 6   0-3 1-4 2-5
        
        int n = lists.size();
        if (n == 0) return NULL;
        while(n > 1) {
            int k = (n + 1) / 2;
            
            for (int i = 0; i < n / 2; i ++) {
                lists[i] = mergeTwoLists(lists[i], lists[i + k]);
            }
            n = k;
        }
        
        return lists[0];    
    }
    
    // merge two lists
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        auto dummy = new ListNode(-1);
        auto p = dummy;
        
        while(l1 && l2) {
            if (l1->val <= l2->val) {
                p->next = l1;
                p = l1;
                l1 = l1->next;
            } else {
                p->next = l2;
                p = l2;
                l2 = l2->next;
            }
        }
        
        if (l1) p->next = l1;
        if (l2) p->next = l2;
        
        return dummy->next;
    }
    
    
};

最後に書かれたブログは思考の知識をまとめたコンピュータサイエンスの分野を中心に、レビューは、私の目標を理解することは容易である各ブログを書くために、:技術と知識を共有することは喜びである、と私はみんなを歓迎します一緒に学習の交換をして、そこにコメントエリアには疑問もありませんが、またあなた(^∀^●)との深い交流を楽しみにすることができます

308元記事公開 ウォンの賞賛149 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/qq_43827595/article/details/104538442