2021-01-06

题解 十

马上就要去上数学课了,写篇题解走人!

题目名称:链表合并
题目来源:江西理工大学OJ
题目地址:http://oj.jxust.edu.cn/problems/1067

题目描述
已有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

这个题目的话呢,意义在于考察我们对数据结构链表的使用,但是我作为一个萌新还没有学,所以我采用了另外两种方法来解决,而且更简单。
方法一:定义两个数组,让两个数组互相之间以下标联系起来,就可以达到题目所需效果;
方法二:定义一个结构体,其他的和方法一类似。

上代码!!(方法一)

#include 
using namespace std;
int main()
{
      
	int a[10000], b[10000];//定义两个以下标联系的数组
	int n, m;
	cin >> n >> m;
	int t = m + n;//直接把两个数视作一个数,灵活一些
	for (int i = 0; i < t; i++)
	{
     
		cin >> a[i] >> b[i];//输入数据
	}
	for (int i = 0; i < t; i++)
	{
     
		for (int j = 1; j < t - i; j++)//利用冒泡排序将其排序,当然了利用快排,选择排,桶排也都可以
		{
     
			if (a[j - 1] > a[j])
			{
     
				swap(a[j - 1], a[j]);
				swap(b[j - 1], b[j]);//分别交换
			}
		}
	}
	for (int i = 0; i < t; i++)
	{
     
		cout << a[i] << " " << b[i] << endl;//输出结果
	}
	return 0;//就这么愉快的结束啦!
}

继续上代码 (方法二)

#include 
using namespace std;
struct student {
     
	int a, b;
};//定义一个含有两个整数的结构体
int main()
{
      
	student c[1000];
	int n, m;
	cin >> n >> m;
	int t = m + n;
	for (int i = 0; i < t; i++)
	{
     
		cin >> c[i].a >> c[i].b;//输入数据
	}
	for (int i = 0; i < t; i++)
	{
     
		for (int j = 1; j < t - i; j++)
		{
     
			if (c[j-1].a > c[j].a)
			{
     
				swap(c[j - 1], c[j]);//利用冒泡排序,这边可以直接交换结构体了,省事一点
			}
		}
	}
	for (int i = 0; i < t; i++)
	{
     
		cout <<c[i].a<< " " << c[i].b << endl;//输出结果
	}
	return 0;//就这么愉快的结束啦!!
}

知识点总结:

  1. 数组下标联系的使用
  2. 结构体的定义和使用
  3. 学会使用冒泡排序
  4. 学会以不同的眼光看待一个问题

这个题目我虽然没有达到练习链表的目的,但是我培养了一种思想,那就是一个题目有时候的解法可以有很多种,看待问题的角度也可以有许多种,有时候未必要以题目引导你的方式去解题,可以跳出改题目,以“另外一种眼光去对待这个题目”。
好了,这篇题解就到这了。昨天我们老师也问我有没有兴趣参加蓝桥杯,我说有兴趣,他说你现在提前参加也挺好的,可能进不了国赛,也当一次经历嘛,激励一下自己,我也是这么认为的!感谢我们老师看得起我,还来问我要不要参加,还拉我进了一个只有3个20级其他都是学长学姐的群,这个老师我爱了!等我期末考试结束,我就去准备蓝桥杯啦!我会尽我所能!
嘿嘿,我现在的目标是4月的蓝桥杯拿一个省二,不知道有没有可能,尽力吧!
好了,每篇题解都附上一句话。

先变成更喜欢的自己,然后遇到一个不需要取悦的人。

你可能感兴趣的:(题解,c++)