#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.