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

题目链接

【题解】

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

【代码】

/**
 * 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];
    }
};
posted @ 2019-11-09 16:44  AWCXV  阅读(141)  评论(0编辑  收藏  举报