力扣 题目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]

....

这样结果就出来了

代码


递归

 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 }
View Code

迭代

 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 }
View Code

 

posted @ 2022-04-11 09:46  无聊的阿库娅  阅读(33)  评论(0编辑  收藏  举报