Java实现单链表的合并(保证数据的有序性)
一、思路
1.比较两个链表的大小
2.将小链表插入到大链表中
3.使用插入保证链表数据的有序性
二、核心代码
/**
* 合并两个链表,并且按照有序合并
* @param singleLinkedList1 链表1
* @param singleLinkedList2 链表2
*/
public static void mergeLinkedList2(SingleLinkedList singleLinkedList1, SingleLinkedList singleLinkedList2) {
int num1 = getLength(singleLinkedList1.getNode());
int num2 = getLength(singleLinkedList2.getNode());
if (singleLinkedList1.getNode().next == null || singleLinkedList2.getNode().next == null) {
return;
}
if (num1 >= num2) {
Node cur = singleLinkedList2.getNode().next;
Node cur2 = null;
while (cur != null) {
cur2 = cur.next;
singleLinkedList1.insert(cur);
cur = cur2;
}
} else {
Node temp = singleLinkedList1.getNode().next;
Node temp2 = null;
while (temp != null) {
temp2 = temp.next;
singleLinkedList2.insert(singleLinkedList1.getNode());
temp = temp2;
}
}
}
三、全代码
package com.company;
import java.util.Stack;
/**
* @author:抱着鱼睡觉的喵喵
* @date:2021/2/4
* @description:
*/
public class LinkedListDemo {
public static void main(String[] args) {
Node node4 = new Node(4, 96, "Ronin");
Node node1 = new Node(2, 100, "lisi");
Node node2 = new Node(1, 99, "张三");
Node node3 = new Node(3, 63, "zsh");
Node node5 = new Node(5, 65, "zms");
SingleLinkedList singleLinkedList = new SingleLinkedList();
SingleLinkedList singleLinkedList2 = new SingleLinkedList();
singleLinkedList.insert(node4);
singleLinkedList.insert(node1);
singleLinkedList.insert(node2);
singleLinkedList2.insert(node3);
singleLinkedList2.insert(node5);
mergeLinkedList2(singleLinkedList,singleLinkedList2);
int num1 = getLength(singleLinkedList.getNode());
int num2 = getLength(singleLinkedList2.getNode());
if (num1 >= num2) {
singleLinkedList.list();
} else {
singleLinkedList2.list();
}
}
//计算链表长度
public static int getLength(Node node) {
if (node.next == null) {
return 0;
}
int length = 0;
Node cur = node.next;
while (cur != null) {
length++;
cur = cur.next;
}
return length;
}
/**
* 合并两个链表,并且按照有序合并
* @param singleLinkedList1 链表1
* @param singleLinkedList2 链表2
*/
public static void mergeLinkedList2(SingleLinkedList singleLinkedList1, SingleLinkedList singleLinkedList2) {
int num1 = getLength(singleLinkedList1.getNode());
int num2 = getLength(singleLinkedList2.getNode());
if (singleLinkedList1.getNode().next == null || singleLinkedList2.getNode().next == null) {
return;
}
if (num1 >= num2) {
Node cur = singleLinkedList2.getNode().next;
Node cur2 = null;
while (cur != null) {
cur2 = cur.next;
singleLinkedList1.insert(cur);
cur = cur2;
}
} else {
Node temp = singleLinkedList1.getNode().next;
Node temp2 = null;
while (temp != null) {
temp2 = temp.next;
singleLinkedList2.insert(singleLinkedList1.getNode());
temp = temp2;
}
}
}
}
//节点类
class Node {
public Node next;
public int sno;
public int score;
public String data;
public Node() {
}
public Node(int Sno, int NScore, String Data) {
this.sno = Sno;
this.score = NScore;
this.data = Data;
}
@Override
public String toString() {
return "Node{" +
"sno=" + sno +
", score=" + score +
", data='" + data + '\'' +
'}';
}
}
//节点操作类
class SingleLinkedList {
private Node head = new Node(0, 0, ""); //初始化头节点
public Node getNode() {
return head;
}
// add student data
public void add(Node node) { //数据添加
Node temp = head;
while (temp.next != null) {
temp = temp.next;
}
temp.next = node;
}
//output
public void list() { //遍历数据进行打印
Node temp = head.next;
if (temp == null) {
System.out.println("LinkedList is empty!");
} else {
while (temp != null) {
System.out.println(temp);
System.out.println();
temp = temp.next;
}
}
}
//insert by order 2
public void insert(Node node) { //插入数据方式2
Node temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.sno > node.sno) {
break;
} else if (temp.next.sno == node.sno) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("Student ID :" + node.sno + "already exists!");
return;
} else {
node.next = temp.next;
temp.next = node;
}
}
public void modify(Node newNode) { //修改操作
Node temp = head.next;
if (head.next == null) {
System.out.println("LinkedList is empty,unable to modify!");
return;
}
boolean flag = false;
while (true) {
if (temp == null) {
break;
}
if (temp.sno == newNode.sno) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.score = newNode.score;
temp.data = newNode.data;
} else {
System.out.println("No student ID" + newNode.sno);
}
}
public void delete(int sno) { //删除操作
Node temp = head;
boolean flag = false;
if (head.next == null) {
System.out.println("LinkedList is empty,Unable to delete.");
return;
}
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.sno == sno) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("No student ID:" + sno);
}
}
}
Java实现单链表的合并(保证数据的有序性)的更多相关文章
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)
使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- 面试之路(10)-BAT面试之java实现单链表的插入和删除
链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...
- Java实现单链表的快速排序和归并排序
本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...
- java实现单链表常见操作
一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- 用java实现单链表
对于一个单链表来说,要求有最基本的数据节点以及一些重要的方法. 方法应该有增删改查.定位.输出.获取链表长度.排序.链表读入.链表输出.下面是我用java写的单链表 public class List ...
随机推荐
- 如何构建一个PKM系统
原文链接 这篇文章是个人知识总结相关的第一篇文章,主要目的是为了阐述我们为什么需要一个 PKM 系统,并且简单对自己这几年亲身形成的PKM 系统进行总结. PKM 是什么? PKM 是 Persona ...
- CF1453D题解
VP 的时候发现的一道数学题( 在思考这个问题之前,先让我们思考一件事:走到距离上一个存档点 \(n\) 的位置的期望是多少?(假设这个值为 \(f[n]\)) 先思考 \(f[1]\) 是多少,很明 ...
- VS Code通过code runner插件编译运行多个cpp文件 | 链接编译.h文件
1.多个cpp文件在同一级目录 参考:https://jingyan.baidu.com/article/2f9b480d7ceb3d01ca6cc224.html 此时可通过修改Code Runne ...
- 题解0005:数的划分(洛谷P1025)
题目描述:将整数 n 分成 k 份,每份不能为空,颠倒顺序的被看成一种分法. 题目链接:https://www.luogu.com.cn/problem/P1025 题目思路:深搜剪枝,规定搜索的下一 ...
- 什么是 Spring Cloud?
Spring cloud 流应用程序启动器是 于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成.Spring cloud Task,一个生命周期短暂的微服务框架,用于快 ...
- 什么是 DAO 模式?
DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了 抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访 问操作.在实际的开发中,应该将所有对 ...
- 在虚拟机里面运行java程序
首先输入vi在里面写一个java程序 然后再查找jdk 复制jdk名字 然后安装jdk 安装完之后输入Javac加你创建的文件名 然后再输入Java 和文件名(这个不要加后缀)然后就打印出来了
- 您对 Mike Cohn 的测试金字塔了解多少?
Mike Cohn 提供了一个名为 Test Pyramid 的模型.这描述了软件开发所需的自 动化测试类型. 根据金字塔,第一层的测试数量应该最高.在服务层,测试次数应小于单元测试 级别,但应大于端 ...
- Spring源码分析笔记--AOP
核心类&方法 BeanDefinition Bean的定义信息,封装bean的基本信息,从中可以获取类名.是否是单例.是否被注入到其他bean中.是否懒加载.bean依赖的bean的名称等. ...
- 获取Java数据库中结果集的每个字段名和个数
/** * 查询到多条数据, 封装到List<Map> */public List<Map<String, Object>> queryForMapList(Str ...