• AcWing 3639.链表合并


    原题链接:AcWing 3639.链表合并

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

    输入格式
    第一行输入第一个链表的结点数 S1。

    第二行输入 S1 个整数,两两之间用空格隔开。

    第三行输入第二个链表的结点数 S2。

    第四行输入 S2 个整数,两两之间用空格隔开。

    输出格式
    输出合并之后的链表结果,两两之间用空格隔开。

    数据范围
    1≤S1,S2≤100
    输入样例:

    4
    2 4 6 8
    3
    3 5 7
    
    • 1
    • 2
    • 3
    • 4

    输出样例:

    2 3 4 5 6 7 8
    
    • 1

    方法一:链表合并

    思路:

    遍历两个链表,将小一点的那个节点接到结果链表上
    最后不要忘了扫尾

    C++代码:

    #include 
    using namespace std;
    
    // 定义结构体
    struct Node{
        int val;
        Node *next;
        
        // 新建结点的函数 冒号起赋值作用
        Node(int _val):val(_val), next(NULL) {}
    };
    
    // 在l链表插入结点x
    void insert(Node *l, int x){
        Node *p = new Node(x);
        
        Node *q = l;
        while(q->next != NULL)
            q = q->next;
        
        q->next = p;
    }
    
    // 打印链表
    void print(Node *l){
        Node *p = l;
        while(p != NULL){
            printf("%d ", p->val);
            p = p->next;
        }
    }
    
    int main(){
        Node *l1 = new Node(-1);
        Node *l2 = new Node(-1);
        
        int n, m, x;
        
        // 插入构建链表l1
        scanf("%d", &n);
        for(int i = 0; i < n; i++ ){
            scanf("%d", &x);
            insert(l1, x);
        }
        
        // 插入构建链表l2
        scanf("%d", &m);
        for(int i = 0; i < m; i++ ){
            scanf("%d", &x);
            insert(l2, x);
        }
    
        // ans作为返回结果
        Node *ans = new Node(-1);
        Node *t = ans;
        
        // p、q为指向当前结点的两个指针
        Node *p = l1->next;
        Node *q = l2->next;
    
        while(p && q){
            if(p->val < q->val){
                t->next = p;
                p = p->next;
            }
            else{
                t->next = q;
                q = q->next;
            }
            
            t = t->next;
        }
        
        // 扫尾 有没完的链表 都接到后面
        if(p) t->next = p;
        if(q) t->next = q;
        
        print(ans->next);
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    复杂度法分析:

    • 空间复杂度:O(1),返回值不算复杂度
    • 时间复杂度:O(m+n),遍历完两个链表
  • 相关阅读:
    .NET Avalonia开源、免费的桌面UI库 - SukiUI
    抽象类与接口
    Android KeyStore 秘钥导入
    【动手学深度学习----注意力机制笔记】
    Jetpack结合MVVM可以开发出一个多优秀的APP?
    Mysql之数据处理及数据汇总函数
    【Android】画面卡顿优化列表流畅度六(终篇)
    string 类以及模拟实现
    1612A无线信道仿真器30MHz~6GHz
    Java 字符流案例_集合与文件内容的相互转化(升级版)
  • 原文地址:https://blog.csdn.net/cwtnice/article/details/127984270