考研机试 链表合并
给定两个元素有序(从小到大)的链表,要求将两个链表合并成一个有序(从小到大)链表。
输入格式
第一行输入第一个链表的结点数 S1。
第二行输入 S1个整数,两两之间用空格隔开。
第三行输入第二个链表的结点数 S2。
第四行输入 S2个整数,两两之间用空格隔开。
输出格式
输出合并之后的链表结果,两两之间用空格隔开。
链表所以使用list 用最暴力的方法创建三个list
分别用于存放链表1链表2以及最后需要输出的链表3
一定要注意对链表初始化时
cpp
list<int> list1(s1);//表示初始化list1 长度为s1
for(int i=0;i<s1;++i){
int a;
scanf("%d",&a);
list1.push_back(a);//这样得到的list1长度为2*s1因为push_back是在链表最后添加元素的
}
可以初始化链表之后先打印检验一下
cpp
//链表只能使用list
#include <iostream>
#include <list>
using namespace std;
int main(){
int s1,s2;
scanf("%d",&s1);
list<int> list1;
list<int>::iterator it1;
for(int i=0;i<s1;++i){
int a;
scanf("%d",&a);
list1.push_back(a);
}
scanf("%d",&s2);
list<int> list2;
list<int>::iterator it2;
for(int i=0;i<s2;++i){
int a;
scanf("%d",&a);
list2.push_back(a);
}
for(it1=list1.begin();it1!=list1.end();++it1){
printf("%d ",*it1);
}
printf("\n");
for(it2=list2.begin();it2!=list2.end();++it2){
printf("%d ",*it2);
}
printf("\n");
//从大到小合并
list<int> list3(s1+s2);
list<int>::iterator it3;
it3=list3.begin();
for(it1=list1.begin(),it2=list2.begin();(it1!=list1.end())&&(it2!=list2.end());++it3){
if(*it1<=*it2){
*it3=*it1;++it1;
}else {
*it3=*it2;++it2;
}
}
//其中一方到头了 另一方直接续上
while(it1!=list1.end()){
*it3=*it1;
++it1;
++it3;
}
while(it2!=list2.end()){
*it3=*it2;
++it2;
++it3;
}
for(it3=list3.begin();it3!=list3.end();++it3){
printf("%d ",*it3);
}
}