[PTA]实验11-2-5 链表拼接

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]实验11-2-5 链表拼接相关的知识,希望对你有一定的参考价值。

本题要求实现一个合并两个有序链表的简单函数。链表结点定义如下:

struct ListNode {
    int data;
    struct ListNode *next;
};

函数接口定义:

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);

其中list1和list2是用户传入的两个按data升序链接的链表的头指针;函数mergelists将两个链表合并成一个按data升序链接的链表,并返回结果链表的头指针。

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
};

struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     while (p) {
           printf("%d ", p->data);
           p = p->next;
     }
     printf("\\n");
}

int main()
{
    struct ListNode  *list1, *list2;

    list1 = createlist();
    list2 = createlist();
    list1 = mergelists(list1, list2);
    printlist(list1);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

1 3 5 7 -1
2 4 6 -1

输出样例:

1 2 3 4 5 6 7 
  • 提交结果:

在这里插入图片描述

  • 源码:
#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode* next;
};

struct ListNode* createlist(); /*裁判实现,细节不表*/
struct ListNode* mergelists(struct ListNode* list1, struct ListNode* list2);
void printlist(struct ListNode* head)
{
    struct ListNode* p = head;
    while (p) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\\n");
}

int main()
{
    struct ListNode* list1, * list2;

    list1 = createlist();
    list2 = createlist();
    list1 = mergelists(list1, list2);
    printlist(list1);

    return 0;
}

/* 你的代码将被嵌在这里 */
struct ListNode* createlist()    /*裁判实现,细节不表*/
{
    struct ListNode* head, * tail;      // 头节点、尾节点

    tail = head = NULL;

    int data;

    scanf("%d", &data);

    // 以#作为输入结束符
    while (data!=-1)
    {
        // 为临时节点分配内存
        struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
        // 临时节点指向空
        temp->next = NULL;
        // 存入数据
        temp->data = data;

        // 将第一个数据存入头节点
        if (head == NULL)
        {
            head = temp;
        }
        else
        {
            // 将临时节点连接到链表尾
            tail->next = temp;
        }

        // 更新尾节点
        tail = temp;

        scanf("%d", &data);
    }

    return head;
}

struct ListNode* mergelists(struct ListNode* list1, struct ListNode* list2)
{
    // 新建一个有头节点的链表存储合并后的链表
    struct ListNode* list = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* head = list;

    // 当两个链表都不为空时,比较他们的值
    // 直到其中一个链表被遍历完
    while (list1 != NULL && list2 != NULL)
    {
        // list1的数据小于list2,将list1的该节点连接到list后
        if (list1->data < list2->data)
        {
            // list指向list1
            list->next = list1;
            // list1后移,继续与list2比较
            list1 = list1->next;
            // list后移一位
            list = list->next;
        }
        else
        {
            // 将list2的当前节点连接到list后
            list->next = list2;
            // list2后移
            list2 = list2->next;
            // list后移
            list = list->next;
        }
    }

    // 当list2先遍历完,把list1的剩余节点连接到list后
    while (list1 != NULL)
    {
        // list1的节点连接到list后
        list->next = list1;
        // list1后移
        list1 = list1->next;
        // list后移
        list = list->next;
    }

    // 当list1先遍历完,将list2的剩余元素连接到list后
    while (list2 != NULL)
    {
        // 将list2的节点连接到list后
        list->next = list2;
        // list2后移
        list2 = list2->next;
        // list后移
        list = list->next;
    }

    // list有头节点,不存储数据,返回头节点的下一节点
    head = head->next;

    return head;
}

以上是关于[PTA]实验11-2-5 链表拼接的主要内容,如果未能解决你的问题,请参考以下文章

实验11-2-5-链表 链表拼接 (20 分)

[PTA]实验11-2-9 链表逆置

[PTA]实验11-2-6 奇数值结点链表

[PTA]实验11-2-1 建立学生信息链表

[PTA]实验11-2-3 逆序数据建立链表

[PTA]实验11-2-2 学生成绩链表处理