PAT.7-1 按格式合并两个链表

news2024/9/21 12:43:06

题目

在这里插入图片描述
在这里插入图片描述

解题思路

题目一看是和链表相关的,而且是两个链表,那肯定核心思路和双指针相关了。
我们来一步步拆分问题:

  1. 首先我们要把给我们的链表构建出来,所以需要一个Node类,以及一个buildNode的方法。
  2. 那么输入给我们的是一个Node的三个属性,我们可以构建一个key:地址 val:Node对象的MAP,用来辅助构造List<Node> (为啥是构造的List<Node>呢,是因为这题将数组作为链表,比较好处理,不然链表的next,pre,处理起来比较麻烦)。
  3. 经过上面两步,已经构建出来两个List<Node>了,此时我们进行倒序合并,这里就用核心逻辑双指针,指针1指向长链表的开头,指针2指向短链表的结尾(指针2向后移动以达到倒序插入的效果),我们有长短两个链表,需求是短的倒序后隔两个往长的插,所以我们只需要遍历长链表,存储一个countcount % 2 == 0 代表了隔两个元素。
  4. res构建出来后这个时候虽然Node的顺序对了,但是node内部的值nextAddress还是老的,需要更新为新顺序的address:res.get(i).nextAddress = res.get(i + 1).address;

代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[]  firstData = sc.nextLine().split(" ");
        String firstHeadAddress = firstData[0];
        String secondHeadAddress = firstData[1];
        int totalSize = Integer.parseInt(firstData[2]);

        //key:地址 val:Node对象
        Map<String,Node> addressNodeMap = new HashMap<>();
        //构建nodeMap
        for(int i =0; i < totalSize; i++){
            String[] tmpList = sc.nextLine().split(" ");
            String curAdd = tmpList[0];
            int curVaule = Integer.parseInt(tmpList[1]);
            String nextAdd = tmpList[2];
            Node node = new Node(curAdd, curVaule, nextAdd);
            addressNodeMap.put(curAdd, node);
        }
        //构建List<Node>
        List<Node> firstNodeList = buildNodeList(firstHeadAddress,addressNodeMap);
        List<Node> secondNodeList = buildNodeList(secondHeadAddress,addressNodeMap);

        //为了确保fifirstNodeList就是长的那个,进行二次置换
        if(firstNodeList.size() < secondNodeList.size()){
            List<Node> tmpVal = new ArrayList<>();
            tmpVal = firstNodeList;
            firstNodeList = secondNodeList;
            secondNodeList = tmpVal;
        }

        //核心逻辑:进行倒序合并
        List<Node> res = new ArrayList<>();
        int firstPointer = 0;
        //短的指针从尾部开始扫,这样就达到了倒序的目的
        int secondPointer = secondNodeList.size()-1;
        int count = 0;
        for (int i = 0; i < firstNodeList.size(); i++) {
            res.add(firstNodeList.get(i));
            count++;
            // 每隔两个元素插入一个短链表元素
            if (count % 2 == 0 && secondPointer >= 0) {
                res.add(secondNodeList.get(secondPointer));
                secondPointer--;
            }
        }
        for (int i = 0; i < res.size() - 1; i++) {
            if(i == res.size()-1){
                res.get(res.size() - 1).nextAddress = "-1";
            }else{
                res.get(i).nextAddress = res.get(i + 1).address;
            }
        }

        //转化成对应的格式输出
        for (Node node : res) {
            System.out.println(node.address + " " + node.data + " " + node.nextAddress);
        }
    }

    //通过nodeMap来构建List<Node>
    public static List<Node> buildNodeList(String headAddress, Map<String,Node> addressNodeMap){
        List<Node> tmpRes = new ArrayList<>();
        String curAddress = headAddress;
        while(true){
            if(addressNodeMap.get(curAddress) == null){
                break;
            }
           Node tmpNode = addressNodeMap.get(curAddress);
            tmpRes.add(tmpNode);
            curAddress = tmpNode.nextAddress;
        }
        return tmpRes;
    }

    public static class Node{
        String address;
        int data;
        String nextAddress;
        public Node(String address, int data, String nextAddress) {
            this.address = address;
            this.data = data;
            this.nextAddress = nextAddress;
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAS理解和说明

目录 1.CAS是什么? 2.CAS的应用场景 2.1 实现原子类 2.2 实现自旋锁 3.CAS的典型问题:ABA问题 1.CAS是什么? CAS:全称compare and swap(比较并交换) 我们假设内存中的原始数据V&#xff0c;旧的预期值A&#xff0c;需要修改的新值B 1.比较A与V是否相等&#xff08;比较…

EmguCV学习笔记 VB.Net 9.2 VideoWriter类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

Android Camera 之 CameraInfo 编码模板(前后置摄像头理解、摄像头图像的自然方向理解)

一、Camera.CameraInfo Camera.CameraInfo 是用于获取设备上摄像头信息的一个类&#xff0c;它提供摄像头的各种详细信息&#xff0c;例如&#xff0c;摄像头的方向、是否支持闪光灯等&#xff0c;以下是它的常用属性 static int CAMERA_FACING_BACK&#xff1a;表示设备的后置…

kubernetes 中 利用yaml文件部署应用

目录 1 用yaml文件部署应用有以下优点 1.1 声明式配置&#xff1a; 1.2 灵活性和可扩展性&#xff1a; 1.3 与工具集成&#xff1a; 2 资源清单参数介绍 2.1 获得资源帮助指令explain 2.2 编写示例 2.2.1 示例1&#xff1a;运行简单的单个容器pod 2.2.2 示例2&#xff1a;运行…

二叉树 - 最大二叉树

654. 最大二叉树 方法一 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param…

java整合Redission

1.maven仓库查询Redisson并倒入项目 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.35.0</version> </dependency> 2.配置文件&#xff08;采用yml配置方式&…

江协科技STM32学习- P9 OLED调试工具

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

2024年9月5日历史上的今天大事件早读

1885年9月5日 左宗棠病逝福州 1894年9月5日 中国古文字学家容庚出生 1905年9月5日 在中国土地上进行的日俄战争结束 1919年9月5日 可口可乐公司成立 1929年9月5日 上海沙逊大厦落成 1937年9月5日 最大一次纳粹集会在纽伦堡举行 1939年9月5日 汪伪政权设立特务组织“七十六…

vue3安装sass时报错:Embedded Dart Sass couldn‘t find the embedded compiler executable

vue3安装sass&#xff1a; npm install sass --save-dev 引用 <template><div class"c1"><h1>hello</h1></div> </template> <style lang"scss">.c1{background-color:red;h1{color:yellow;}} </style>报…

通信算法之230: 5G随机接入PRACH及长度计算

在介绍超远覆盖特性之前&#xff0c;先需了解一下终端接入网络的基本过程。在任何情况下&#xff0c;终端同网络建立通信&#xff0c;都需通过RACH(随机接入信道)向网络发送一个报文来向系统申请一条信令信道&#xff0c;这就是随机接入的过程。根据3GPP 5G R15标准&#xff0c…

如何禁止 Ubuntu 内核更新 ?

更新系统对于保持它的安全和运行是很重要的&#xff0c;然而有时您可能希望停止内核的更新。如果您需要保持系统稳定&#xff0c;或者特定软件在某个内核版本上运行得最好&#xff0c;那么这将非常有用。 在本指南中&#xff0c;我们将向您展示如何在 Ubuntu 中阻止内核更新。…

基于 Konva 实现Web PPT 编辑器(二)

动画系统 为了实现演示中复杂的动画效果&#xff0c;使用 Animation 类统一管理&#xff1b;切换动画通过 css animation 实现&#xff0c;并且是应用在 konvajs-content 上&#xff0c;动画则通过 gsap 实现&#xff0c;应用在 Konva.Node 上&#xff0c;实现思路如下&#xf…

win12R2安装.NET Framework 3.5

一丶安装原因 因此插件的缺失, 有些软件或系统不支持安装. 二丶安装步骤 1丶下载.NET Framework 3.5 点击插件下载, 提取码: 1995, 下载完成之后解压到想要安装的位置上. 2丶打开 服务器管理器 3丶点击: 管理 -> 添加角色和功能 4丶点击下一步到服务器角色, 选择web服…

SQL的高级查询练习知识点(day24)

目录 1 学习目标 2 基础查询 2.1 语法 2.2 例子 3 条件查询 3.1 含义 3.2 语法 3.3 条件表达式 3.3.1 条件运算符 3.3.2 例子 3.4 逻辑表达式 3.4.1 逻辑运算符 3.4.2 例子 3.5 模糊查询 3.5.1 概述 3.5.2 例子 4 DISTINCT关键字 4.1 含义 4.2 例子 5 总结…

代码随想录算法训练营第五十天 | 98. 所有可达路径

目录 98. 所有可达路径 思路 图的存储 邻接矩阵 邻接表 深度优先搜索 1.确认递归函数&#xff0c;参数 2.确认终止条件 3.处理目前搜索节点出发的路径 方法一&#xff1a; 邻接矩阵写法 方法二&#xff1a;邻接表写法 98. 所有可达路径 题目链接&#xff1a;卡码网题…

2024年第十五届蓝桥杯青少组国赛撞期GESP认证、放弃那个?

昨天蓝桥杯青少组官网发布了速查|第十五届蓝桥杯大赛青少组省赛成绩查询&#xff0c;首先恭喜2024年蓝桥杯青少组省赛一等奖的同学晋级蓝桥杯大赛青少组国赛&#xff0c;蓝桥杯青少组国赛的时间为2024年9月7日&#xff0c;CCF GESP编程能力等级认证也在同一天开始&#xff0c;同…

Linux工具: 查询各种系统数据库和服务的linux命令getent详解

目录 一、概述 二、用法 1、基本语法 &#xff08;1&#xff09;database &#xff08;2&#xff09;key 2、常见的数据库类型 3、获取帮助 三、示例 1. 查询用户账号信息 2. 列出所有用户 3. 查询特定组的信息 4. 列出所有组 5. 查询主机名和 IP 地址映射 6. 列…

vue3中openlayers绘制多个Overlay

项目需求是要在地图上显示多个div&#xff0c;之前使用Overlay绘制单个显示正常&#xff0c;结果绘制多个的时候就显示一个&#xff0c;不过也解决了&#xff0c;下面我就把核心代码贴一下&#xff0c;如果有什么问题可以留言&#xff0c;我就是提供一个思路。 效果图 上面图片…

昂科烧录器支持Fortior Tech峰岹科技的电机驱动专用芯片FU6812V

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Fortior Tech峰岹科技的高性能电机驱动专用芯片FU6812V已经被昂科的通用烧录平台AP8000所支持。 FU6812V是一款集成电机控制引擎(ME)和8051内核的高性能电机驱动专用芯片&…

Nginx性能调优

为什么是Nginx而不是apache&#xff1f; 轻量级&#xff0c;同样起web服务器&#xff0c;比apache占用更少的内存资源静态处理&#xff0c;Nginx静态处理性能比apache高3倍以上抗并发&#xff0c;Nginx处理请求时异步非阻塞的&#xff0c;而apache则是阻塞型的&#xff0c;在高…