力扣 题目23-- 合并K个升序链表
题目
23. 合并K个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists = [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释:链表数组如下: [ 1->4->5, 1->3->4, 2->6 ] 将它们合并到一个有序链表中得到。 1->1->2->3->4->4->5->6 示例 2: 输入:lists = [] 输出:[] 示例 3: 输入:lists = [[]] 输出:[] 提示: - k == lists.length - 0 <= k <= 10^4 - 0 <= lists[i].length <= 500 - -10^4 <= lists[i][j] <= 10^4 - lists[i] 按 升序 排列 - lists[i].length 的总和不超过 10^4
题解
如果你是按照顺序做的题 那么在第21题-合并两个有序链表(不懂的可以点这里) 会发现这里有个两个链表的方法
那么我们能不能转换呢 答案是可以的 即分治法
在21题中我们传入了list1与list2 原本是直接的链表 但是
我们现在让list2为第n个链表 而list1则为第n-1个链表排序后的链表
即第一次传入 lists[0],lists[1]
而第二次传入 lists[0]和lists[1]排序后的链表(即上一次排序方法返回的链表),lists[2]
....
这样结果就出来了
代码
递归
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct ListNode { 5 int val; 6 ListNode* next; 7 ListNode() : val(0), next(nullptr) {} 8 ListNode(int x) : val(x), next(nullptr) {} 9 ListNode(int x, ListNode* next) : val(x), next(next) {} 10 }; 11 ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { 12 if (list1 == NULL) { 13 return list2; 14 } 15 else if (list2 == NULL) { 16 return list1; 17 } 18 else if (list1->val >= list2->val) { 19 list2->next = mergeTwoLists(list1, list2->next); 20 return list2; 21 } 22 else if (list1->val < list2->val) { 23 list1->next = mergeTwoLists(list1->next, list2); 24 return list1; 25 } 26 return list1; 27 } 28 class Solution { 29 public: 30 ListNode* mergeKLists(vector<ListNode*>& lists) { 31 if (lists.size() == 0) { 32 return NULL; 33 } 34 ListNode* list1= lists[0]; 35 ListNode* list2; 36 for (int i = 1; i < lists.size(); i++) { 37 list1=mergeTwoLists(list1, lists[i]); 38 } 39 for (int i = 1; list1!=NULL; i++) { 40 cout << list1->val << endl; 41 list1 = list1->next; 42 } 43 return list1; 44 } 45 }; 46 void listnum(ListNode& list, vector<int>& vectorlist) { 47 ListNode* headlist = &list; 48 for (int i = 0; i < vectorlist.size(); i++) { 49 ListNode* p; 50 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 51 p->val = vectorlist[i]; 52 headlist->next = p; 53 headlist = headlist->next; 54 } 55 headlist->next = NULL; 56 } 57 int main() { 58 Solution sol; 59 ListNode list1(1); 60 vector<int> vectorlist1 = { 4,5 }; 61 listnum(list1, vectorlist1); 62 ListNode list2(1); 63 vector<int> vectorlist2 = { 3,4 }; 64 listnum(list2, vectorlist2); 65 ListNode list3(2); 66 vector<int> vectorlist3 = { 6 }; 67 listnum(list3, vectorlist3); 68 vector<ListNode*> lists = { &list1,&list3,&list2 }; 69 ListNode* head = sol.mergeKLists(lists); 70 71 }
迭代
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 struct ListNode { 5 int val; 6 ListNode* next; 7 ListNode() : val(0), next(nullptr) {} 8 ListNode(int x) : val(x), next(nullptr) {} 9 ListNode(int x, ListNode* next) : val(x), next(next) {} 10 }; 11 ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { 12 ListNode* headlist = new ListNode(); 13 ListNode* head = headlist; 14 if (list1 == NULL) { 15 return list2; 16 } 17 else if (list2 == NULL) { 18 return list1; 19 } 20 else if (list1->val >= list2->val) { 21 headlist->val = list2->val; 22 list2 = list2->next; 23 } 24 else if (list1->val < list2->val) { 25 headlist->val = list1->val; 26 list1 = list1->next; 27 } 28 while (true) { 29 if (list1 == NULL && list2 == NULL) { 30 break; 31 } 32 else if (list1 == NULL) { 33 headlist->next = list2; 34 list2 = list2->next; 35 } 36 else if (list2 == NULL) { 37 headlist->next = list1; 38 list1 = list1->next; 39 } 40 else if (list1->val >= list2->val) { 41 42 headlist->next = list2; 43 list2 = list2->next; 44 } 45 else if (list1->val < list2->val) { 46 headlist->next = list1; 47 list1 = list1->next; 48 } 49 headlist = headlist->next; 50 } 51 headlist->next = NULL; 52 return head; 53 } 54 class Solution { 55 public: 56 ListNode* mergeKLists(vector<ListNode*>& lists) { 57 if (lists.size() == 0) { 58 return NULL; 59 } 60 ListNode* list1= lists[0]; 61 ListNode* list2; 62 for (int i = 1; i < lists.size(); i++) { 63 list1=mergeTwoLists(list1, lists[i]); 64 } 65 for (int i = 1; list1!=NULL; i++) { 66 cout << list1->val << endl; 67 list1 = list1->next; 68 } 69 return list1; 70 } 71 }; 72 void listnum(ListNode& list, vector<int>& vectorlist) { 73 ListNode* headlist = &list; 74 for (int i = 0; i < vectorlist.size(); i++) { 75 ListNode* p; 76 p = (struct ListNode*)malloc(sizeof(struct ListNode*)); 77 p->val = vectorlist[i]; 78 headlist->next = p; 79 headlist = headlist->next; 80 } 81 headlist->next = NULL; 82 } 83 int main() { 84 Solution sol; 85 ListNode list1(1); 86 vector<int> vectorlist1 = { 4,5 }; 87 listnum(list1, vectorlist1); 88 ListNode list2(1); 89 vector<int> vectorlist2 = { 3,4 }; 90 listnum(list2, vectorlist2); 91 ListNode list3(2); 92 vector<int> vectorlist3 = { 6 }; 93 listnum(list3, vectorlist3); 94 vector<ListNode*> lists = { &list1,&list3,&list2 }; 95 ListNode* head = sol.mergeKLists(lists); 96 97 }