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 <= 104
- 0 <= lists[i].length <= 500
- -104 <= lists[i][j] <= 104
- lists[i] 按 升序 排列
- lists[i].length 的总和不超过 104
解题方法
链表转数组–>排序–>数组转链表
- C 语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
int my_cmp(const void* a, const void* b) { return *(int*)a - *(int*)b; }
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
int tab[10000] = {0};
int cnt = 0;
struct ListNode *head = NULL, *ptr = NULL;
// 链表数值提取到数组
for (int i = 0; i < listsSize; i++) {
struct ListNode* temp = lists[i];
while (NULL != temp) {
tab[cnt++] = temp->val;
printf("%d ", temp->val);
temp = temp->next;
}
}
// 排序
qsort(tab, cnt, sizeof(int), my_cmp);
// 数组转回链表
for (int j = 0; j < cnt; j++) {
if (NULL == head) {
struct ListNode* temp =
(struct ListNode*)malloc(sizeof(struct ListNode));
head = temp;
ptr = temp;
ptr->val = tab[j];
ptr->next = NULL;
} else {
struct ListNode* temp =
(struct ListNode*)malloc(sizeof(struct ListNode));
temp->next = NULL;
temp->val = tab[j];
ptr->next = temp;
ptr = ptr->next;
}
}
return head;
}
递归、两两合并
- C 语言
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// 递归实现两个链表合并
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
if (list1 == NULL) {
return list2;
}
if (list2 == NULL) {
return list1;
}
if (list1->val < list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
} else {
list2->next = mergeTwoLists(list1, list2->next);
return list2;
}
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize) {
struct ListNode* ptr = NULL;
// 两两合并
for (int i = 0; i < listsSize; i++) {
ptr = mergeTwoLists(ptr, lists[i]);
}
return ptr;
}