一、思路

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实现单链表的合并(保证数据的有序性)的更多相关文章

  1. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  2. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  3. 使用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 ...

  4. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  5. 面试之路(10)-BAT面试之java实现单链表的插入和删除

    链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...

  6. Java实现单链表的快速排序和归并排序

    本文描述了LeetCode 148题 sort-list 的解法. 题目描述如下: Sort a linked list in O(n log n) time using constant space ...

  7. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  8. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  9. 用java实现单链表

    对于一个单链表来说,要求有最基本的数据节点以及一些重要的方法. 方法应该有增删改查.定位.输出.获取链表长度.排序.链表读入.链表输出.下面是我用java写的单链表 public class List ...

随机推荐

  1. 您的请求在Web服务器中没有找到对应的站点”这是什么原因?出现这个界面说明域名解析已经正确并生效,这是由于域名没有绑定好,

    宝塔出现 您的请求在Web服务器中没有找到对应的站点"这是什么原因?出现这个界面说明域名解析已经正确并生效,这是由于域名没有绑定好 , 本人经过测试使用如下方法解决.允话空HTTP_REFE ...

  2. mysql全量备份与增量备份

    mysql全量备份与增量备份   1.全量备份 全量备份就是把数据库中所有的数据进行备份. 备份所有库: mysqldump -uroot -p456 -S /data/3306/mysql.sock ...

  3. oneAPI DPC++学习资料和实验平台

    DPC++ 一种新的异构平台,弥补了OPENCL 编写复杂的难题.基于SYCL 抽象层.基于SYCL 有多种实现,其中DPC++是相对成熟的方案. 书籍 由Intel工程师撰写的免费电子图书 Data ...

  4. html 两个并列div样式

    1.html 代码 <html> <head> <link rel="stylesheet" href="cs2.css"> ...

  5. 最长公共子串(DP)

    DP基础_最长公共子串 Description 两个序列的最长公共子串,这个子串要求在序列中是连续的.如:"bab"和"caba" (可以看出来最长公共子串是& ...

  6. DDOS反射攻击

    0x01 环境 包含3台主机 attact 作为攻击方,使用Centos7.2 reflect 作为流量放大器,安装有dns .ntp .memcached三种可以放大流量的服务 windows_se ...

  7. 基于SpringBoot实现自动装配返回属性

    一:需求背景 在业务开发中经常会有这个一个场景,A(业务表)表中会记录数据的创建人,通常我们会用userId字段记录该数据的创建者,但数据的使用方会要求展示该数据的创建者姓名,故我们会关联用户表拿该用 ...

  8. Linux下mysql的彻底卸载

    1.查看mysql的安装情况 rpm -qa | grep -i mysql 2.删除上图安装的软件 rpm -ev mysql-community-libs-5.7.27-1.el6.x86_64 ...

  9. class文件和java文件区别

  10. 面试问题之C++语言:简述编译过程

    转载于:https://blog.csdn.net/ypshowm/article/details/89374706 编译过程主要分为四步: 1.词法分析(扫描) 运行类似于有限状态机的算法将源代码的 ...