题目 1052: [编程入门]链表合并

2023-11-08

已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列。

输入格式

第一行,a、b两个链表元素的数量N、M,用空格隔开。 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成

输出格式

按照学号升序排列的数据

样例输入

2 3
5 100
6 89
3 82
4 95
2 10

样例输出

2 10
3 82
4 95
5 100
6 89

学号的升序怎么写的:

  1. 当插入一个新的节点时,需要按照学号的升序将节点插入到链表中。

  2. 对于链表A和链表B,一开始它们可能是无序的。但在将它们合并成一个新的链表时,需要保持新链表中的节点按照学号的升序排列。

  3. 针对插入操作,可以使用两种方法:

    • 每次插入时,遍历链表找到合适的插入位置。比较新节点的学号与当前节点的学号大小,找到合适的位置后,将新节点插入到该位置。这种方法的时间复杂度为O(N),其中N是链表的长度。

    • 使用递归或迭代的方法,在插入新节点时保持链表的有序性。比较新节点的学号与当前节点的学号大小,根据大小关系选择插入到当前位置或继续递归或迭代到下一个节点。这种方法的时间复杂度也为O(N)。

思路:

  1. mergeLinkedList函数实现了两个有序链表的合并操作。它接收两个链表的头节点指针headaheadb,然后创建一个虚拟头节点dummy作为合并后的链表头部的前一个节点。同时定义三个指针papbpc分别指向链表A、B和合并后的链表的当前节点。通过比较两个链表节点的学号,每次选择较小的学号节点连接到合并后的链表中,直到其中一个链表遍历完。最后将剩余的链表直接连接到合并后的链表的末尾。最后返回合并后的链表的头节点指针

  2. getInput函数从标准输入中获取一个学生信息,并创建一个新的节点来存储这个学生信息。返回这个新节点的指针。

  3. main函数中,首先初始化两个链表的头节点指针listalistbnullptr。然后从标准输入中读取两个整数numanumb分别表示链表A和链表B的长度。接下来,使用一个循环读取numa个学生信息,并按照“学号的升序”将学生插入链表A中。再使用一个循环读取numb个学生信息,并按照学号的升序将学生插入链表B中。

  4. 调用mergeLinkedList函数将链表A和链表B合并成一个新的链表,并将返回的合并链表的头节点指针保存在mergedList中。

  5. 使用一个循环打印合并后的链表的每个节点的学号和成绩。

  6. 最后,使用一个循环释放合并后的链表中每个节点的内存,避免内存泄漏。

#include <iostream>

using namespace std;

struct student {
    int id;
    int grade;
};

struct Node {
    student data;
    Node* next;
};

Node* mergeLinkedList(Node* heada, Node* headb) {
    Node* dummy = new Node;  // 创建一个虚拟头节点
    dummy->next = nullptr;

    Node* pa = heada;
    Node* pb = headb;
    Node* pc = dummy;

    while (pa != nullptr && pb != nullptr) {
        if (pa->data.id < pb->data.id) {
            pc->next = pa;
            pa = pa->next;
        }
        else {
            pc->next = pb;
            pb = pb->next;
        }
        pc = pc->next;
    }

    if (pa != nullptr) {
        pc->next = pa;
    }
    else {
        pc->next = pb;
    }

    Node* result = dummy->next;
    delete dummy;
    return result;
}

Node* getInput() {
    int id, grade;
    cin >> id >> grade;
    Node* newNode = new Node{ {id, grade}, nullptr };
    return newNode;
}

int main() {
    Node* lista = nullptr;
    Node* listb = nullptr;
    int numa, numb;
    cin >> numa >> numb;

    student s;
    for (int i = 0; i < numa; i++) {
        cin >> s.id >> s.grade;
        Node* newNode = new Node{ s, nullptr };

        if (!lista || s.id < lista->data.id) {
            newNode->next = lista;
            lista = newNode;
        }
        else {
            Node* temp = lista;
            while (temp->next != nullptr && temp->next->data.id < s.id) {
                temp = temp->next;
            }
            newNode->next = temp->next;
            temp->next = newNode;
        }
    }

    for (int i = 0; i < numb; i++) {
        cin >> s.id >> s.grade;
        Node* newNode = new Node{ s, nullptr };

        if (!listb || s.id < listb->data.id) {
            newNode->next = listb;
            listb = newNode;
        }
        else {
            Node* temp = listb;
            while (temp->next != nullptr && temp->next->data.id < s.id) {
                temp = temp->next;
            }
            newNode->next = temp->next;
            temp->next = newNode;
        }
    }

    Node* mergedList = mergeLinkedList(lista, listb);

    // 打印合并后的链表
    Node* temp = mergedList;
    while (temp != nullptr) {
        cout << temp->data.id << " " << temp->data.grade << endl;
        temp = temp->next;
    }

    // 释放内存
    while (mergedList != nullptr) {
        Node* temp = mergedList;
        mergedList = mergedList->next;
        delete temp;
    }

    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

题目 1052: [编程入门]链表合并 的相关文章

  • Python计算日照总辐射量

    import numpy as np from datetime import datetime import pandas as pd def get dayofyear date string param date string 字符串
  • YOLOv5训练目标检测数据集(小白)

    一 提前准备工作 1 利用labelimg软件给收集到的图片打标签 具体步骤网上都有 2 下载好yolov5 v6 1 源码 下载地址 https github com ultralytics yolov5 用pycharm打开 在项目目录

随机推荐

  • flutter 点击事件写法

    onTapUp onTapDown void onTapDown TapUpDetails details async 或者是 onTapDown e selectCommonWordIndex index mySetState
  • vue-入门篇

    1 目标 了解什么是VUE 2 vue基础 2 1 概述 官网 https cn vuejs org Vue js是一套构建用户界面的渐进式框架 Vue 采用自底向上增量开发的设计 Vue 的核心库只关注视图层 它不仅易于上手 还便于与第三
  • MySQL - 表索引概述

    索引概述 基本概念 日常生活中 我们经常会在电话号码簿中查阅 某人 的电话号码 按姓查询或者按字母排序查询 在字典中查阅 某个词 的读音和含义等等 以快速的找到特定记录 在这里 姓 和 字母 都可看作是索引 而按 姓 或者 字母 查询则是按
  • 进程控制一之进程创建、进程终止、进程等待

    进程创建 创建子进程使用fork函数 fork有两个返回值 pid t fork void pid t相当于int 失败 返回小于0的值 成功 0 返回给子进程 大于0 返回子进程的pid给父进程 fork失败原因 内存不足 创建PCB是需
  • 程序员编程艺术PDF

    程序员编程艺术 链接 https pan baidu com s 1XWk E2DIJwYRlXNGwB LHA 提取码 nptd
  • Java基础(24)——异常、处理异常的方式详解及示例

    Java基础 24 异常详解 版权声明 一 异常体系 1 概述 2 异常的根类 Throwable 3 错误 Error 4 Exception 二 异常的处理方式 1 默认的异常处理方式 2 try catch方式 1 基本知识 2 使用
  • boost::sort::block_indirect_sort相关的测试程序

    boost sort block indirect sort是Boost库中的一个排序算法 它在排序大型数据集时表现出色 本文将介绍如何使用Boost库中的block indirect sort算法 并提供一个相关的测试程序 首先 确保已经
  • 帆软设置参数框样式

    修改前 修改后 ps 取消掉参数面板的 常用参数组合 自定义初始化控件后点击文本框会弹出对应的显示框 each this options form name widgets function i item console info item
  • android.util.AndroidRuntimeException: You cannot combine custom titles with other title features

    在做项目的时候自定义一个TitleBar 但是 其中是用到TabHost ActivityGroup 左右滑动的时候 由于TabHost中有个默认的titleBar 而在哪个自己的主界面也有一个titlebar 两个冲突了所以会报错andr
  • 【算法竞赛宝典】语言之争

    算法竞赛宝典 语言之争 题目描述 代码展示 题目描述 代码展示 语言之争 include
  • linux下查看系统安装时间,Linux下如何查看系统启动时间和运行时间以及安装时间...

    1 uptime命令 输出 16 11 40 up 59 days 4 21 2 users load average 0 00 0 01 0 00 2 查看 proc uptime文件计算系统启动时间 cat proc uptime 输出
  • 数值计算笔记之插值(三) 分段线性插值

    0 回顾 对于 拉格朗日插值多项式与牛顿插值多项式的统一 次拉格朗日插值多项式为 其中 牛顿插值公式 在插值节点 插值条件相同的情况下 二者本质一样 只是计算过程不一样 牛顿插值适合需要增加节点 提高精度的情况 不需要重新开始计算 可以利用
  • dfs和bfs求二叉树的深度

    方法一 后序遍历 DFS 树的后序遍历 深度优先搜索往往利用 递归 或 栈 实现 本文使用递归实现 关键点 此树的深度和其左 右 子树的深度之间的关系 显然 此树的深度 等于 左子树的深度 与 右子树的深度 中的 最大值 1 终止条件 当
  • 数据结构_43

    主要内容 背包问题 关键路径 一 背包问题 给定空间 给定物品 选取最符合条件的物品 0 1背包 完全背包 多重背包 二 关键路径 AOV网中完成所有事件需要的最短时间 最长路径 关键活动所在的路径 AOV网 有向带权图 起点 入度为零 终
  • 机械革命旷世e win10 ubuntu20双系统(安装与删除)

    参考 https www bilibili com video BV1554y1n7zv 这里面把整体性的东西说的很清楚 这里我主要记录对这个机型的一些特别不一样的地方 注意事项 1 一定要先解决磁盘的bitlocker状态 那个有影响 2
  • FISCO BCOS(十九)———新开虚拟机在搭建区块链平台时的部分问题及解决办法

    1 新开虚拟机的密码认证问题 2 网卡固定问题 root wyg virtual machine vim etc netplan 01 network manager all yaml 3 ubuntu远程连接的问题 4 无法解析域名 cn
  • 魔兽世界怀旧服哪个服务器金价稳定,魔兽世界怀旧服 金价到底会跌到多少的分析...

    原标题 魔兽世界怀旧服 金价到底会跌到多少的分析 魔兽世界怀旧服有一个特点 大家对金价的敏感程度堪比外汇买家 在外汇交流群都没见过如此频率的价格关注与分析 在魔兽怀旧服 几乎人人都是满仓炒家 每次金价下跌一片哀嚎的景象 还真是MMORPG里
  • adb push&pull文件方法

    adb push命令 从电脑上传送文件到设备 adb pull命令 从手机传送文件到电脑 pull命令 从手机传送文件到电脑 a cmd 控制台 adb connect ip 连接设备 b adb devices查看设备连接情况 c 将设备
  • 【VS2010学习笔记】【函数学习】一(VC6.0和VS2010主函数的不同)

    问题 为什么VC6 0中主函数为main 而VS2010中为 tmain 1 Main是所有c或c 的程序执行的起点 tmain是main为了支持unicode所使用的main的别名 tmain 不过是unicode版本的的main 2 t
  • 题目 1052: [编程入门]链表合并

    已有a b两个链表 每个链表中的结点包括学号 成绩 要求把两个链表合并 按学号升序排列 输入格式 第一行 a b两个链表元素的数量N M 用空格隔开 接下来N行是a的数据 然后M行是b的数据 每行数据由学号和成绩两部分组成 输出格式 按照学