• 链表合并(暑假每日一题 3)


    给定两个单链表 L 1 = a 1 → a 2 → … → a n − 1 → a n L_1=a_1→a_2→…→a_{n−1}→a_n L1=a1a2an1an
    L 2 = b 1 → b 2 → … → b m − 1 → b m L_2=b_1→b_2→…→b_{m−1}→b_m L2=b1b2bm1bm

    如果 n ≥ 2 m n≥2m n2m,你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如 a 1 → a 2 → b m → a 3 → a 4 → b m − 1 … a_1→a_2→b_m→a_3→a_4→b_{m−1}… a1a2bma3a4bm1 的结果。

    例如给定两个链表分别为 6 → 7 6→7 67 1 → 2 → 3 → 4 → 5 1→2→3→4→5 12345,你应该输出 1 → 2 → 7 → 3 → 4 → 6 → 5 1→2→7→3→4→6→5 1273465

    补充
    本题中可能包含不在两个单链表中的节点,这些节点无需考虑。

    输入格式
    输入首先在第一行中给出两个链表 L 1 L1 L1 L 2 L2 L2 的头结点的地址,以及正整数 N N N,即给定的结点总数。

    一个结点的地址是一个 5 5 5 位数的非负整数(可能包含前导 0 0 0),空地址 NULL−1 表示。

    随后 N N N 行,每行按以下格式给出一个结点的信息:

    Address Data Next
    
    • 1

    其中 Address 是结点的地址,Data 是不超过 1 0 5 10^5 105 的正整数,Next 是下一个结点的地址。

    题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。

    输出格式
    按顺序输出结果链表,每个结点占一行,格式与输入相同。

    数据范围
    1 ≤ N ≤ 1 0 5 1≤N≤10^5 1N105

    输入样例:

    00100 01000 7
    02233 2 34891
    00100 6 00001
    34891 3 10086
    01000 1 02233
    00033 5 -1
    10086 4 00033
    00001 7 -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输出样例:

    01000 1 02233
    02233 2 00001
    00001 7 34891
    34891 3 10086
    10086 4 00100
    00100 6 00033
    00033 5 -1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    #include
    #include
    #include
    
    using namespace std;
    
    const int N = 1000010;
    
    int n, h1, h2;
    int e[N], ne[N];
    
    int main(){
        
        cin >> h1 >> h2 >> n;
        
        int address, data, neaddress;
        for(int i = 0; i < n; i++){
            cin >> address >> data >> neaddress;
            e[address] = data;
            ne[address] = neaddress;
        }
        
        vector<int> v1, v2, v3;
        for(int i = h1; ~i; i = ne[i])
            v1.push_back(i);
        for(int i = h2; ~i; i = ne[i])
            v2.push_back(i);
        
        if(v1.size() < v2.size()) swap(v1, v2);
        
        reverse(v2.begin(), v2.end());
        for(int i = 0; i < v1.size(); i++){
            v3.push_back(v1[i]);
            if(i % 2 && i / 2 < v2.size()) v3.push_back(v2[i/2]);
        }
        
        for(int i = 0; i < v3.size(); i++){
            
            printf("%05d %d ", v3[i], e[v3[i]]);
            if(i == v3.size() - 1) puts("-1");
            else printf("%05d\n", v3[i+1]);
        }
        
    }
    
    • 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
  • 相关阅读:
    6-21漏洞利用-mysql弱口令破解
    springboot+vue+elementui旅游景点门票预订网站java
    0031【Edabit ★☆☆☆☆☆】【使用箭头函数】Using Arrow Functions
    《canvas》之第13章 事件操作
    “扫一扫,不一定是二维码” ScanCan GitHub开源项目发起
    B+树的生成过程 怎么去看懂B+树
    小谈设计模式(29)—访问者模式
    k8s 资源管理
    前缀、中缀、后缀表达式相互转换工具
    LeetCode_多源 BFS_中等_2258.逃离火灾
  • 原文地址:https://blog.csdn.net/qq_46456049/article/details/125908961