PAT乙级2019年秋季最后一题_链表合并JAVA版本 (25 分)

这道题在考场上没有时间做啊,电脑实在太搞人了,实名dis中北的电脑,打开项目的时候都过了四五十分钟,难受~,现在官网还没有收录这道题,不知道能拿多少分,仅供参考

给定两个单链表 L​1​​=a​1​​→a​2​​→⋯→a​n−1​​→a​n​​ 和 L​2​​=b​1​​→b​2​​→⋯→b​m−1​​→b​m​​。如果 n≥2m,你的任务是将比较短的那个链表逆序,然后将之并入比较长的那个链表,得到一个形如 a​1​​→a​2​​→b​m​​→a​3​​→a​4​​→b​m−1​​⋯ 的结果。例如给定两个链表分别为 6→7 和 1→2→3→4→5,你应该输出 1→2→7→3→4→6→5。

输入格式:

输入首先在第一行中给出两个链表 L​1​​ 和 L​2​​ 的头结点的地址,以及正整数 N (≤10​5​​),即给定的结点总数。一个结点的地址是一个 5 位数的非负整数,空地址 NULL 用 -1 表示。

随后 N 行,每行按以下格式给出一个结点的信息:

Address Data Next

其中 Address 是结点的地址,Data 是不超过 10​5​​ 的正整数,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

package pat19秋季;

import java.util.Scanner;

class lian{
		int id;
		int data;
		int next;
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public int getData() {
			return data;
		}
		public void setData(int data) {
			this.data = data;
		}
		public int getNext() {
			return next;
		}
		public void setNext(int next) {
			this.next = next;
		}
		public lian() {
			super();
			// TODO Auto-generated constructor stub
		}

	}
public class 链表合并 {
	static lian[] lians = new lian[100005];
	static lian[] lians1 = new lian[100005];
	static lian[] lians2 = new lian[100005];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int l1 = sc.nextInt();
		int l2 = sc.nextInt();
		int n = sc.nextInt();
		int id,data,next;
		for (int i = 0; i < n; i++) {
			id=sc.nextInt();
			data=sc.nextInt();
			next=sc.nextInt();
			lians[id]=new lian();
			lians[id].setId(id);
			lians[id].setData(data);
			lians[id].setNext(next);
		}
		int p=l1;
		int n1=0,n2=0;
		while(p!=-1){
			lians1[n1++]=lians[p];
			p=lians[p].next;

		}p=l2;
		while(p!=-1){
			lians2[n2++]=lians[p];
			p=lians[p].next;
			System.out.println(n2);
		}
		int flag=0;
		if(n1>=2*n2){
			int g=0;
			n2--;
			while(g<n1||n2>0){
				if(g<n1){
				
				if(flag==0){
					System.out.printf("%05d %d ",lians1[g].getId(),lians1[g].getData());	
					g++;
				}else{
					System.out.printf("%05d\n%05d %d ",lians1[g].getId(),lians1[g].getId(),lians1[g].getData());
					g++;
				}
				}
				flag=1;
				if(g<n1){
					System.out.printf("%05d\n%05d %d ",lians1[g].getId(),lians1[g].getId(),lians1[g].getData());
					g++;
				}
				if(n2>=0){
					System.out.printf("%05d\n%05d %d ",lians2[n2].getId(),lians2[n2].getId(),lians2[n2].getData());
					n2--;
				}
					
			}
			System.out.println("-1");
		}else{
			int g=0;
			n1--;
			while(g<n2||n1>0){
				if(g<n2){
				
				if(flag==0){
					System.out.printf("%05d %d ",lians2[g].getId(),lians2[g].getData());	
					g++;
				}else{
					System.out.printf("%05d\n%05d %d ",lians2[g].getId(),lians2[g].getId(),lians2[g].getData());
					g++;
				}
				}
				flag=1;
				if(g<n2){
					System.out.printf("%05d\n%05d %d ",lians2[g].getId(),lians2[g].getId(),lians2[g].getData());
					g++;
				}
				if(n1>=0){
					System.out.printf("%05d\n%05d %d ",lians1[n1].getId(),lians1[n1].getId(),lians1[n1].getData());
					n1--;
				}
					
			}
			System.out.println("-1");
		}
		
	}
		
		
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值