合并K个升序链表C语言
时间: 2024-12-16 15:15:10 浏览: 13
合并K个升序链表是指将K个已排序的单链表合并成一个新的单链表,保持链表元素的顺序不变。这通常通过迭代或递归的方式实现。以下是使用C语言的一个基本思路:
```c
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
ListNode* mergeKLists(ListNode** lists, int k) {
// 如果k为0,说明列表为空,直接返回NULL
if (k == 0) return NULL;
// 创建一个头节点,表示合并后的链表
ListNode* head = new ListNode(0);
ListNode* tail = head;
int currentPos[k]; // 存储当前每个链表的指针
for (int i = 0; i < k; ++i) {
if (lists[i] != NULL) {
currentPos[i] = lists[i];
} else {
currentPos[i] = NULL;
}
}
while (true) {
int minIndex = -1;
// 找到最小值所在的链表位置
for (int i = 0; i < k; ++i) {
if (currentPos[i] != NULL && (minIndex == -1 || currentPos[i]->val < currentPos[minIndex]->val)) {
minIndex = i;
}
}
// 如果找到非空链表并且其头部是最小的,将其添加到结果链表
if (minIndex != -1) {
tail->next = currentPos[minIndex];
tail = tail->next;
// 移动当前链表指针
if (currentPos[minIndex] != NULL) {
currentPos[minIndex] = currentPos[minIndex]->next;
} else {
currentPos[minIndex] = NULL;
}
} else { // 所有链表都遍历完了,结束循环
break;
}
}
return head->next; // 返回合并后的链表头节点
}
```
阅读全文