1161 Merging Linked Lists (25 point(s)) PAT

该博客主要探讨了如何处理两个已知长度的单链表,将较短的链表按照特定格式插入到较长链表中。具体来说,如果短链表有m个节点,长链表有n个节点(n>=2m),则需要先逆转短链表,然后按照a1->a2->bm->a3->a4->bm-1的顺序合并。博主给出了输入输出格式,包括链表节点的表示方式和数据结构,以及解题思路和完整代码实现。解决方案涉及链表的逆转和插入操作,是数据结构和算法的一个经典应用。
摘要由CSDN通过智能技术生成

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=a1a2an1an and L 2 = b 1 → b 2 → ⋯ → b m − 1 → b m L_2=b_1→b_2→⋯→b_{m−1}→b_m L2=b1b2bm1bm. 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} a1a2bma3a4bm1⋯. 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;
}

注意

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值