给定两个单链表 链表合并(暑假每日一题 3)_模拟
链表合并(暑假每日一题 3)_i++_02

如果 链表合并(暑假每日一题 3)_链表_03,你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如 链表合并(暑假每日一题 3)_结点_04

例如给定两个链表分别为 链表合并(暑假每日一题 3)_链表_05链表合并(暑假每日一题 3)_i++_06,你应该输出 链表合并(暑假每日一题 3)_模拟_07

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

输入格式
输入首先在第一行中给出两个链表 链表合并(暑假每日一题 3)_链表_08链表合并(暑假每日一题 3)_链表_09 的头结点的地址,以及正整数 链表合并(暑假每日一题 3)_模拟_10,即给定的结点总数。

一个结点的地址是一个 链表合并(暑假每日一题 3)_链表_11 位数的非负整数(可能包含前导 链表合并(暑假每日一题 3)_结点_12),空地址 ​​​NULL​​​ 用 ​​−1​​ 表示。

随后 链表合并(暑假每日一题 3)_模拟_10

Address Data Next

其中 ​​Address​​​ 是结点的地址,​​Data​​​ 是不超过 链表合并(暑假每日一题 3)_i++_14 的正整数,​​​Next​​ 是下一个结点的地址。

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

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

数据范围
链表合并(暑假每日一题 3)_结点_15

输入样例:

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]);
}

}