持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情
题目描述:
已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:
输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。
输出格式:
在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。
输入样例:
1 3 5 -1
2 4 6 8 10 -1
输出样例:
1 2 3 4 5 6 8 10
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
题目分析:
开始的时候是不是有的同学想到的是用数组存数字呀~,但是你会发现你不知道这两个数组的长度,是两个动态数组,有的同学想到了vector容器,但是注意了,vector容器的创建是非常动态的,每加数字,它将会在内存中找一个足够大的一串连续的地址来存放新的vector数组,这会比较麻烦。于是我采用list容器来存放这两个链表(数据结构给大家的不只是代码,而是数据结构的思维)~
题目步骤:
- 1.创建两个list空链表,将数据输入到这两个list里
- 2.创建这两个链表的头部迭代器
- 3.创建一个新的list(l3)用来存放两个list合并的数字
- 4.创建l3的头部迭代器,按照题目的要求不断地迭代它
代码如下:
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int>l1, l2, l3;
int x;
cin >> x;
//list尾插
while (x != -1) {
l1.push_back(x);
cin >> x;
}
cin >> x;
while (x != -1) {
l2.push_back(x);
cin >> x;
}
//创建两个迭代器
list<int>::iterator it1 = l1.begin();
list<int>::iterator it2 = l2.begin();
//两个链表的合并思路
while (it1 != l1.end() && it2 != l2.end()) {
if (*it1 < *it2) {
l3.push_back(*it1);
it1++;
}
else {
l3.push_back(*it2);
it2++;
}
}
//将两个链表其中一个链表连接到后面
//it1还有剩余
while (it1 != l1.end()) {
l3.push_back(*it1);
it1++;
}
//it2还有剩余
while (it2 != l2.end()) {
l3.push_back(*it2);
it2++;
}
//如果l3是空的
if (l3.empty()) {
cout << "NULL";
}
else {
//创建新的迭代器
list<int>::iterator it3 = l3.begin();
cout << *it3;
it3++;
while (it3 != l3.end()) {
cout << " " << *it3;
it3++;
}
}
}
PS: 解题结束~