PTA 1105-链表合并(C++)

embedded/2025/3/29 8:56:08/

给定两个单链表𝐿1=𝑎1→𝑎2→⋯→𝑎𝑛−1→𝑎𝑛L1​=a1​→a2​→⋯→an−1​→an​和𝐿2=𝑏1→𝑏2→⋯→𝑏𝑚−1→𝑏𝑚L2​=b1​→b2​→⋯→bm−1​→bm​ 。如果𝑛≥2𝑚n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如𝑎1→𝑎2→𝑏𝑚→𝑎3→𝑎4→𝑏𝑚−1⋯a1​→a2​→bm​→a3​→a4​→bm−1​⋯的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。

输入格式:

输入首先在第一行中给出两个链表𝐿1L1​和𝐿2L2​的头结点的地址,以及正整数𝑁(≤105)N(≤105),即给定的结点总数。一个结点的地址是一个 5 位数的非负整数,空地址 NULL 用 -1 表示。

随后 行,每行按以下格式给出一个结点的信息:

Address Data Next

Copy

其中 Address 是结点的地址,Data 是不超过105105的正整数,Next 是下一个结点的地址。题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。

输出格式:

按顺序输出结果链表,每个结点占一行,格式与输入相同。

输入样例:

00100 01000 7
02233 2 34891
00100 6 00001
34891 3 10086
01000 1 02233
00033 5 -1
10086 4 00033
00001 7 -1

Copy

输出样例:

01000 1 02233
02233 2 00001
00001 7 34891
34891 3 10086
10086 4 00100
00100 6 00033
00033 5 -1
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;struct node {int addr;int data;int next;
};
map<int, node> mp;
vector<node> list;
vector<node> list2;
int main() {int l1, l2;int n;cin >> l1 >> l2 >> n;for (int i = 0; i < n; ++i) {node t;cin >> t.addr >> t.data >> t.next;mp[t.addr] = t; //存入map}for (int p = l1; p != -1; p = mp[p].next) {//存入vector容器list.push_back(mp[p]);}for (int p = l2; p != -1; p = mp[p].next) {list2.push_back(mp[p]);}if (list.size() < list2.size()) {if (list2.size() >= 2 * list.size()) { //判断是否大于2mreverse(list.begin(), list.end());} else {return 0;}} else {if (list.size() >= 2 * list2.size()) {reverse(list2.begin(), list2.end());swap(list, list2);} else {return 0;}}vector<node> m;//建立vector m,将新链表加入m,便于后面输出int index1 = 0, index2 = 0;while (index1 < list2.size() || index2 < list.size()) {if (index1 < list2.size()) {m.push_back(list2[index1++]);}if (index1 < list2.size()) {m.push_back(list2[index1++]);}if (index2 < list.size()) {m.push_back(list[index2++]);}}for (int i = 0; i < m.size() - 1; ++i) {m[i].next = m[i + 1].addr;}m.back().next = -1;//将最后一个的next改为-1for (int i = 0; i < m.size(); ++i) {if (i < m.size() - 1) {printf("%05d %d %05d\n", m[i].addr, m[i].data, m[i].next);} else {printf("%05d %d -1\n", m[i].addr, m[i].data);}}return 0;
}    


http://www.ppmy.cn/embedded/176475.html

相关文章

使用Python开发自动驾驶技术:车道线检测模型

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

深入理解Linux网络随笔(五):深度理解本机网络I/O

深入理解Linux网络随笔&#xff08;五&#xff09;&#xff1a;深度理解本机网络I/O 文章目录 深入理解Linux网络随笔&#xff08;五&#xff09;&#xff1a;深度理解本机网络I/O本机发送过程本机接收过程总结 分析本机网络I/O部分源码需要知道本机I/O是什么&#xff1f;扮演什…

大数据学习(77)-Hive详解

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

Modbus协议编程读写流程图大全

读离散量输入 读保持寄存器 读输入寄存器 写单个线圈 写单个寄存器 写多个线圈 写多个寄存器 (0x14) 读文件记录 写文件记录 (0x16) 屏蔽写寄存器 (0x17) 读/写多个寄存器

从零手撕C++ string类:详解实现原理与优化技巧

&#x1f4cc; 引言 C标准库中的std::string是日常开发中最常用的类之一&#xff0c;但你是否好奇它的底层实现&#xff1f;本文将带你从零实现一个简化版string类&#xff08;命名空间tyx&#xff09;&#xff0c;覆盖构造、拷贝、动态扩容、运算符重载等核心功能&#xff0c…

BMS电池管理系统上下电过程

在整车上下电&#xff08;即全车电源打开和关闭&#xff09;过程中&#xff0c; 以下各个专业名词通常有如下主要含义和作用: 1. CEM(CentralElectronicModule)&#xff1a;中央电子模块&#xff0c;负责多个车辆系统(如照明、座椅控制 等&#xff09;的控制和协调。 2.KL15:…

Android Compose 框架的状态与 ViewModel 的协同(collectAsState)深入剖析(二十一)

Android Compose 框架的状态与 ViewModel 的协同&#xff08;collectAsState&#xff09;深入剖析 一、引言 在现代 Android 应用开发中&#xff0c;构建响应式和动态的用户界面是至关重要的。Android Compose 作为新一代的声明式 UI 工具包&#xff0c;为开发者提供了一种简…

微服务与分布式系统

微服务架构 微服务的概念和特点 微服务架构是一种将应用程序分解为一组小型、独立服务的架构风格&#xff0c;每个服务专注于特定的业务功能&#xff0c;并且可以独立部署、扩展和维护。微服务之间通过轻量级通信协议&#xff08;如HTTP/REST或RPC&#xff09;进行交互。 独立…