首页 > 其他分享 >1105 链表合并——25分

1105 链表合并——25分

时间:2022-10-02 22:26:27浏览次数:41  
标签:25 int v3 next 链表 v1 v2 1105

给定两个单链表 L1=a1→a2→⋯→an−1→anL2=b1→b2→⋯→bm−1→bm。如果 n≥2m,你的任务是将⽐较
短的那个链表逆序,然后将之并⼊⽐较⻓的那个链表,得到⼀个形如 a1→a2→bm→a3→a4→bm−1⋯ 的结果。
例如给定两个链表分别为 6→71→2→3→4→5,你应该输出 1→2→7→3→4→6→5

输⼊格式:
输⼊⾸先在第⼀⾏中给出两个链表 L1 和 L2 的头结点的地址,以及正整数
N (≤105),即给定的结点总数。⼀个结点的地址是⼀个 5 位数的⾮负整数,空地址 NULL-1 表示。
随后 N ⾏,每⾏按以下格式给出⼀个结点的信息:

Address Data Next

其中 Address 是结点的地址,Data 是不超过 10^5 的正整数,Next 是下⼀个结点的地址。题⽬保证没有空链表,
并且较⻓的链表⾄少是较短链表的两倍⻓。

输出格式:
按顺序输出结果链表,每个结点占⼀⾏,格式与输⼊相同。

输⼊样例:

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

输出样例:

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

|代码长度限制 | 时间限制 | 内存限制 |
| 16KB | 400ms | 64MB |

思路:
出现过好几次的题了,代码中会给出注释,不再赘述

代码:

#include <bits/stdtr1c++.h>
using namespace std;
struct node {
    int adress, data, next;
} N[100005];
vector<node> v1, v2, v3;
int sa, sb, n, t;
int main() {
    cin >> sa >> sb >> n;
    for (int i = 0; i < n; i++) {
        cin >> t ;
        N[t].adress = t;
        cin >> N[t].data >> N[t].next;
    }
    while (sa != -1) {
        v1.emplace_back(N[sa]);
        sa = N[sa].next;
    }
    while (sb != -1) {
        v2.emplace_back(N[sb]);
        sb = N[sb].next;
    }
    if (v1.size() < v2.size()) swap(v1, v2); //始终保持v1为较长的那个链表,v2为较短的那个
    for (int i = 0, j = v2.size() - 1; i < int(v1.size()); i++) {
        v3.push_back(v1[i]);
        if (i % 2 != 0 && j >= 0) v3.push_back(v2[j--]); //下标为奇数个的时候插入较短链表的元素
    }
    int len = int(v3.size());
    for (int i = 0; i < len; i++) {
        if (i != len - 1) v3[i].next = v3[i + 1].adress; //重新安排地址,使前后节点的next和adress相关联,注意最后以-1结束
        else v3[i].next = -1;
    }
    for (int i = 0; i < len; i++) {
        if (i != len - 1) printf("%05d %d %05d\n", v3[i].adress, v3[i].data, v3[i].next); //输出部分用scanf和%05d控制格式
        else printf("%05d %d -1", v3[i].adress, v3[i].data);
    }
    return 0;
}

标签:25,int,v3,next,链表,v1,v2,1105
From: https://www.cnblogs.com/Fare-well/p/16749609.html

相关文章

  • day11leetcode232,225,20,1047
    225.用队列实现栈利用两个栈来实现队列的基本操作一个负责进栈一个负责出栈classMyQueue{Stack<Integer>stackIn;Stack<Integer>stackOut;publi......
  • 25.移动端像素比
    像素简介1.基本概念像素屏幕是由一个一个发光的小点构成,这一个个小点就是像素分辨率:1920x1080说的就是屏幕中小点的数量在前端开发中像素分成两种情况讨论,css像素......
  • 代码随想录第十一天 | 232.用栈实现队列、225. 用队列实现栈、20. 有效的括号、1047.
    第一题232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推......
  • 2022-2023-1 20221325《计算机基础与程序设计》第五周学习总结
    班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05作业目标:学习计算机科学概论第6章和《C......
  • T258192 数字转换
    题目描述已知一个 nn 进制数,将其转为 mm 进制,请你编程完成这个任务。输入格式共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16)n(2≤n≤16),第二行是......
  • T258193 低位与高位
    题目描述给出一个小于2^{32}232的正整数。这个数可以用一个3232位的二进制数表示(不足3232位用00补足)。我们称这个二进制数的前1616位为“高位”,后1616位为“低位”。将它......
  • 2022-09-25 反思
    摘要:记录周反思反思:现阶段对于Tianmu引擎功能的单元测试,集成测试都不完善,只有MTR的SQL句子的黑盒测试,而且现在MTR的SQL句子测试也不够完善。建议考虑开发Tianmu引擎......
  • LeetCode86 分隔链表
     idea:烦死了,这个题一直因为创立的指针为空,或者接入结点方法不对,结果将两个小链表搞混乱了,不过具体思路ok。将小值结点成一组,大值结点成一组,最后在首尾相连,实现起来也比......
  • LeetCode21 合并两个有序链表
    将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 (注意给出的三个实例,第一次由于没有注意到另外两个实例,忘记考虑一......
  • Java中队列和链表性能对比-ArrayList和LinkedList
    本文使用ArrayList和LinkedList,分别对比了队列链表的add,get的性能。 具体代码如下,可以直接运行importjava.util.ArrayList;importjava.util.LinkedList;importja......