Merge k Sorted Lists

Given an array of linked-lists lists, each linked list is sorted in ascending order.

Merge all the linked-lists into one sort linked-list and return it.

 

Example 1:

Input: lists = [[1,4,5],[1,3,4],[2,6]]
Output: [1,1,2,3,4,4,5,6]
Explanation: The linked-lists are:
[
1->4->5,
1->3->4,
2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6
Example 2:

Input: lists = []
Output: []
Example 3:

Input: lists = [[]]
Output: []
 

Constraints:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] is sorted in ascending order.
The sum of lists[i].length won't exceed 10^4.

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode *a,ListNode *b)
    {
        if((!a) || (!b)) return a? a:b;
        ListNode head,*tail = &head,*pa =a,*pb =b;
        while(pa && pb)
        {
            if(pa->val <pb->val)
            {
                tail->next =pa;
                pa =pa->next;
            }
            else
            {
                tail->next =pb;
                pb =pb->next;
            }
            tail=tail->next;
        }
        tail->next =(pa? pa:pb);
        return head.next;
    }
    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 mergeTwoLists(merge(lists,l,mid),merge(lists,mid+1,r));
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        return merge(lists,0,lists.size()-1);
    }
};

注意:分治法的练习使用。

 

posted @ 2020-08-26 10:50  zmachine  阅读(95)  评论(0编辑  收藏  举报