1161 Merging Linked Lists (25 point(s))
题目
Given two singly linked lists 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 and 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. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like 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⋯. For example, given one list being 6→7 and the other one 1→2→3→4→5, you must output 1→2→7→3→4→6→5.
Input Specification:
Each input file contains one test case. For each case, the first line contains the two addresses of the first nodes of L 1 L_1 L1 and L 2 L_2 L2, plus a positive N ( ≤ 1 0 5 ) N(≤10^5) N(≤105) which is the total number of nodes given. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is a positive integer no more than
1
0
5
10^5
105, and Next is the position of the next node. It is guaranteed that no list is empty, and the longer list is at least twice as long as the shorter one.
Output Specification:
For each case, output in order the resulting linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 01000 7
02233 2 34891
00100 6 00001
34891 3 10086
01000 1 02233
00033 5 -1
10086 4 00033
00001 7 -1
Sample Output:
01000 1 02233
02233 2 00001
00001 7 34891
34891 3 10086
10086 4 00100
00100 6 00033
00033 5 -1
思路
题意
给出两个链表L1、L2,把短的列表按照a1->a2->bm->a3->a4->bm-1…的格式插入长的列表中。链表地址用5位数表示,给出的输入格式是L1,L2链表的地址,接下来按照地址、数值、下一个指针地址的格式读入n个结点。要求按照排序好后的格式输出链表。
思路
用node{address, data}的结构体存储结点。用数组node m[]存储初始的结点,index表示地址,node内存下一个结点指针和数值。然后从首地址开始根据m把L1和L2存入vector中,把短的链表用reverse函数逆转,然后用一个函数把短链表插入长链表中。
解法
#include<bits/stdc++.h>
using namespace std;
int start1, start2, n;
struct node
{
int address;
int data;
};
vector<node> l1, l2, ans;
node m[100005];
void Output(vector<node> a, vector<node> b) {
for (int i = 0, j = 0; i < a.size() || j < b.size();i++, j++)
{
if (i == 0) printf("%05d %d ", a[i].address, a[i].data);
else printf("%05d\n%05d %d ", a[i].address, a[i].address, a[i].data);
i++;
if (i < a.size()) printf("%05d\n%05d %d ", a[i].address, a[i].address, a[i].data);
if (j < b.size()) printf("%05d\n%05d %d ", b[j].address, b[j].address, b[j].data);
}
printf("-1\n");
}
int main() {
scanf("%d%d%d", &start1, &start2, &n);
for (int i = 0; i < n; i++) {
int ad1, ad2, da;
scanf("%d%d%d", &ad1, &da, &ad2);
m[ad1].address = ad2;
m[ad1].data = da;
}
for (int i = start1; i != -1; i = m[i].address)//a-n
l1.push_back({ i, m[i].data });
for (int i = start2; i != -1; i = m[i].address)//b-m
l2.push_back({ i, m[i].data });
if (l1.size() < l2.size()) {
reverse(l1.begin(), l1.end());
Output(l2, l1);
}
else {
reverse(l2.begin(), l2.end());
Output(l1, l2);
}
return 0;
}
注意
- 无