链表合并(暑假每日一题 3)
原创
©著作权归作者所有:来自51CTO博客作者sweetheart7_7的原创作品,请联系作者获取转载授权,否则将追究法律责任
给定两个单链表 和
。
如果 ,你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如
例如给定两个链表分别为 和 ,你应该输出 。
补充
本题中可能包含不在两个单链表中的节点,这些节点无需考虑。
输入格式
输入首先在第一行中给出两个链表 和 的头结点的地址,以及正整数 ,即给定的结点总数。
一个结点的地址是一个 位数的非负整数(可能包含前导 ),空地址 NULL
用 −1
表示。
随后
其中 Address
是结点的地址,Data
是不超过 的正整数,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
#include<iostream>
#include<vector>
#include<algorithm>
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]);
}
}