Merge k Sorted Lists
阿新 • • 發佈:2020-08-26
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.
/** * 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); } };
注意:分治法的練習使用。