#p1015. 合并链表(代码填空题)
合并链表(代码填空题)
【题目描述】
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
【输入形式】
- 第一行为第一个链表的各结点值(非零),以空格分隔,以0结尾。
- 第二行为第二个链表的各结点值(非零),以空格分隔,以0结尾。
【输出形式】
合并好的链表,以非降序排列,值与值之间以空格分隔。 如果两个都是空的,输出"Empty"
Samples

1 3 4 0
1 2 4 0
1 1 2 3 4 4
2 0
0
2
0
0
0
0 0
0
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构
typedef struct Node {
int value;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = {{FILL}};
newNode->value = value;
newNode->next = NULL;
return newNode;
}
// 读取链表
Node* readList() {
int value;
Node* head = NULL;
Node* tail = NULL;
//尾插法
while (1) {
scanf("%d", &value);
if (value == 0) break;
Node* newNode = createNode(value);
if (head == NULL) {
{{FILL}};
} else {
{{FILL}};
}
tail = newNode;
}
return head;
}
// 合并两个有序链表(不去重)
Node* mergeLists(Node* list1, Node* list2) {
Node* result = NULL;
Node* tail = NULL;
while (list1 != NULL && list2 != NULL) {
Node* newNode;
if (list1->value <= list2->value) {
newNode = createNode(list1->value);
list1 = list1->next;
} else {
newNode = createNode(list2->value);
list2 = list2->next;
}
if (result == NULL) {
result = newNode;
tail = newNode;
} else {
{{FILL}};
}
}
// 处理剩余list1节点,修复tail空指针问题
while (list1 != NULL) {
Node* newNode = createNode(list1->value);
if (result == NULL) {
result = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
list1 = list1->next;
}
// 处理剩余list2节点,修复tail空指针问题
while (list2 != NULL) {
Node* newNode = createNode(list2->value);
if (result == NULL) {
result = newNode;
tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
list2 = list2->next;
}
return result;
}
// 释放链表内存
void freeList(Node* head) {
while (head != NULL) {
Node* temp = head;
head = head->next;
free(temp);
}
}
int main() {
// 读取两个链表
Node* list1 = readList();
Node* list2 = readList();
// 判断两个链表是否都为空
if (list1 == NULL && list2 == NULL) {
printf("Empty\n");
return 0;
}
// 合并链表
Node* merged = mergeLists(list1, list2);
// 输出合并后的链表
Node* current = merged;
while (current != NULL) {
printf("%d", current->value);
if (current->next != NULL) {
printf(" ");
}
current = current->next;
}
printf("\n");
// 释放内存
freeList(list1);
freeList(list2);
freeList(merged);
return 0;
}
Limitation
1s, 1024KiB for each test case.