【LeetCode 23】合并K个排序链表

题目链接

【题解】


会归并排序吧?
就把这K个链表当成是K个数字就好。
然后做归并排序。
因为归并排序的时候本来就会有这么一个过程。
[l..mid]和[mid+1..r]这两段区间都是有序的了已经。
然后再把他们俩合并起来。
合并起来之后把这个链表直接放在这个区间的最左边那个位置就好
上一级的合并要用的时候就直接取这个区间最左边那个链表。
有个人关于时间复杂度的证明说的挺好的贴一下

【代码】

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    
    void merge(vector<ListNode*> &lists,int l,int r){
        if (l>=r) return;
        int mid = (l+r)>>1;
        merge(lists,l,mid);merge(lists,mid+1,r);
        ListNode *temp = (ListNode *) malloc(sizeof(ListNode));
        temp->next =NULL;
        ListNode *p = temp;
        ListNode *p1 = lists[l],*p2 = lists[mid+1];
        while(p1 && p2){
            if (p1->val<p2->val){
                p->next = p1;
                p1 = p1->next;
            }else{
                p->next = p2;
                p2 = p2->next;
            }
            p = p->next;
        }
        if (p2) p1 = p2;
        while (p1){
            p->next = p1;
            p = p->next;
            p1 = p1->next;
        }
        lists[l] = temp->next;
    }
    
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.empty()) return NULL;
        int n = lists.size();
        merge(lists,0,n-1);
        return lists[0];
    }
};

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/11826669.html
今日推荐