给定两个单链表
L
1
=
a
1
→
a
2
→
…
→
a
n
−
1
→
a
n
L_1=a_1→a_2→…→a_{n−1}→a_n
L1=a1→a2→…→an−1→an 和
L
2
=
b
1
→
b
2
→
…
→
b
m
−
1
→
b
m
L_2=b_1→b_2→…→b_{m−1}→b_m
L2=b1→b2→…→bm−1→bm。
如果 n ≥ 2 m n≥2m n≥2m,你的任务是将较短的那个链表逆序,然后将之并入较长的链表,得到形如 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}… a1→a2→bm→a3→a4→bm−1… 的结果。
例如给定两个链表分别为 6 → 7 6→7 6→7 和 1 → 2 → 3 → 4 → 5 1→2→3→4→5 1→2→3→4→5,你应该输出 1 → 2 → 7 → 3 → 4 → 6 → 5 1→2→7→3→4→6→5 1→2→7→3→4→6→5。
补充
本题中可能包含不在两个单链表中的节点,这些节点无需考虑。
输入格式
输入首先在第一行中给出两个链表
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
其中 Address
是结点的地址,Data
是不超过
1
0
5
10^5
105 的正整数,Next
是下一个结点的地址。
题目保证没有空链表,并且较长的链表至少是较短链表的两倍长。
输出格式
按顺序输出结果链表,每个结点占一行,格式与输入相同。
数据范围
1
≤
N
≤
1
0
5
1≤N≤10^5
1≤N≤105
输入样例:
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
#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]);
}
}