每日一练——7-51 两个有序链表序列的合并(20 分)

223 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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: 解题结束~