假设给你 k 个排序链表,这些链表中元素的总数为 n,请设计一个 O(nlgk)-time 的c算法,将这 k 个排序链表合并为一个排序链表,只需要给出关键代码
时间: 2024-10-19 16:11:55 浏览: 18
为了将 k 个已排序的链表合并成一个排序链表,我们可以使用归并排序的思想。这里是一个简单的 C++ 实现关键部分的算法:
```cpp
// 定义节点结构体
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 归并两个排序链表
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1) return l2;
if (!l2) return l1;
if (l1->val < l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
// 合并 k 个链表
ListNode* mergeKLists(vector<ListNode*>& lists) {
if (lists.empty()) return nullptr;
// 使用归并排序策略,递归地将较小的子列表合并在一起
sort(lists.begin(), lists.end(), [](ListNode* a, ListNode* b) { return a->val < b->val; });
ListNode* head = lists[0];
for (int i = 1; i < lists.size(); i++) {
head->next = mergeTwoLists(head->next, lists[i]);
}
return head;
}
```
这个 `mergeKLists` 函数首先对链表指针向量按值从小到大排序,然后逐个通过 `mergeTwoLists` 函数合并相邻的两个有序链表,最终得到一个整体有序的链表。
阅读全文