首页 > 技术文章 > LeetCode 23. 合并K个排序链表(Merge k Sorted Lists)

wmx24 2018-08-30 12:15 原文

题目描述

 

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  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 };

 

推荐阅读