1. 程式人生 > 實用技巧 >Merge k Sorted Lists

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); } };

注意:分治法的練習使用。