考研机试 链表合并

考研机试 链表合并

给定两个元素有序(从小到大)的链表,要求将两个链表合并成一个有序(从小到大)链表。

输入格式

第一行输入第一个链表的结点数 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);
    }

}
相关推荐
L_09072 小时前
【C++】异常
开发语言·c++
Frostnova丶2 小时前
【算法笔记】数学知识
笔记·算法
liulilittle2 小时前
关于拥塞控制的几点思考
网络·c++·tcp/ip·计算机网络·信息与通信·tcp·通信
吴可可1233 小时前
AutoCAD 2016与2014二次开发关键差异
算法
雨白4 小时前
哈希:以时间换空间的算法实战
算法
QT-Neal5 小时前
C++ 编码规范
c++
啦啦啦啦啦zzzz5 小时前
数据结构:红黑树理论
数据结构·c++·红黑树
Yolo_TvT5 小时前
C++:默认构造函数
c++
San813_LDD6 小时前
[数据结构]LeetCode学习
数据结构·算法·图论