合并K个升序链表(分治算法)
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
#include <stdio.h>
#include <assert.h>
struct ListNode
{
int val;
struct ListNode *next;
};
void printList(struct ListNode * list)
{
struct ListNode * plist = list;
while (plist)
{
printf("%d->", plist->val);
plist = plist->next;
}
printf("nullptr\n");
}
void printLists(struct ListNode ** lists, int size)
{
for (int i = 0; i < size; i++)
{
printList(lists[i]);
}
}
struct ListNode * constructList(int * array, int size)
{
struct ListNode list, * cur = &list;
for (int i = 0; i < size; i++)
{
struct ListNode * node = new struct ListNode;
node->val = array[i];
node->next = nullptr;
cur->next = node;
cur = cur->next;
}
return list.next;
}
struct ListNode * merge(struct ListNode * list1, struct ListNode * list2)
{
struct ListNode merlist, * cur = &merlist;
struct ListNode * plist1 = list1, * plist2 = list2;
while (plist1 && plist2)
{
if (plist1->val < plist2->val)
{
cur->next = plist1;
plist1 = plist1->next;
}
else
{
cur->next = plist2;
plist2 = plist2->next;
}
cur = cur->next;
}
cur->next = plist1 ? plist1 : plist2;
return merlist.next;
}
struct ListNode * mergeLists(struct ListNode ** lists, int start, int end)
{
if (start > end)
return nullptr;
if (start == end)
return lists[start];
int middle = (start + end) / 2;
return merge(mergeLists(lists, start, middle), mergeLists(lists, middle + 1, end));
}
struct ListNode * mergeKLists(struct ListNode** lists, int listsSize)
{
return mergeLists(lists, 0, listsSize - 1);
}
int main()
{
int arr1[] = {1, 3, 5, 7, 8, 10, 12};
int arr2[] = {2, 3, 4, 7, 9, 13, 17, 18, 19, 21};
int arr3[] = {3, 6, 9, 15, 22};
int arr4[] = {2, 4, 6, 9, 11, 23, 26, 29};
struct ListNode * list1 = constructList(arr1, sizeof(arr1) / sizeof(int));
struct ListNode * list2 = constructList(arr2, sizeof(arr2) / sizeof(int));
struct ListNode * list3 = constructList(arr3, sizeof(arr3) / sizeof(int));
struct ListNode * list4 = constructList(arr4, sizeof(arr4) / sizeof(int));
struct ListNode ** lists = new struct ListNode * [4];
lists[0] = list1;
lists[1] = list2;
lists[2] = list3;
lists[3] = list4;
printLists(lists, 4);
struct ListNode * merList = mergeKLists(lists, 4);
printList(merList);
return 0;
}