题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
C语言实现,基本思路,归并排序法
struct ListNode* sort(struct ListNode* l, struct ListNode* r)
{struct ListNode head = {0};
struct ListNode* cur = &head;
while (l != NULL && r != NULL) {
if (l->val <= r->val) {
cur->next = l;
cur = cur->next;
l = l->next;
} else {
cur->next = r;
cur = cur->next;
r = r->next;
}
}
if (l != NULL) {
cur->next = l;
}
if (r != NULL) {
cur->next = r;
}
return head.next;
}
struct ListNode* mergesort(struct ListNode** lists, int left, int right)
{
int mid = 0;
struct ListNode *l = NULL, *r = NULL;
if (left < right) {
mid = (left + right) / 2;
l = mergesort(lists, left, mid);
r = mergesort(lists, mid + 1, right);
return sort(l, r);
} else {
return lists[left];
}
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsLen ) {
return mergesort(lists, 0, listsLen - 1);
}