LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)
题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
解题思路
利用分治的思想,划分k个排序链表为两半,递归的合并两部分中的链表。对于单个链表直接返回,对于两个链表调用merge函数,返回合并好的排序链表。
代码
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode* mergeKLists(vector<ListNode*>& lists) { 12 int mid = lists.size() / 2; 13 ListNode* l1 = mergeK(lists, 0, mid - 1); 14 ListNode* l2 = mergeK(lists, mid, lists.size() - 1); 15 return merge(l1, l2); 16 } 17 ListNode* mergeK(vector<ListNode*>& lists, int start, int end) { 18 if(start == end) return lists[start]; 19 else if(start < end){ 20 int mid = (start + end) / 2; 21 ListNode* l1 = mergeK(lists, start, mid); 22 ListNode* l2 = mergeK(lists, mid + 1, end); 23 return merge(l1, l2); 24 } 25 else return NULL; 26 } 27 ListNode* merge(ListNode* l1, ListNode* l2){ 28 if(l1 == NULL) return l2; 29 if(l2 == NULL) return l1; 30 if(l1->val > l2->val) return merge(l2, l1); 31 ListNode* head = l1; 32 while(l2 && l1->next){ 33 if(l1->next->val > l2->val){ 34 ListNode* next = l2->next; 35 l2->next = l1->next; 36 l1->next = l2; 37 l2 = next; 38 } 39 l1 = l1->next; 40 } 41 if(l2) l1->next = l2; 42 return head; 43 } 44 };