博客
关于我
合并两个有序链表
阅读量:156 次
发布时间:2019-02-28

本文共 4738 字,大约阅读时间需要 15 分钟。

合并两个有序链表

1、题目

  • 题目要求:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

  • 示例:

输入:1->2->4, 1->3->4输出:1->1->2->3->4->4

2、代码思路

  1. preNode 为待排序节点的前驱结点, node1node2 分别指向两个链表中待排序的节点,谁小谁就排在 preNode 后面

    image-20200726105943433

  2. 进行比较:由于 node1 指向的节点的值较小,让 preNode 指向 node1 指向的节点

    image-20200726110213463

  3. 然后 preNode 指针后移 ,node1 指针后移

    image-20200726110331016

  4. 再次进行比较:由于 node2 指向的节点的值较小,让 preNode 指向 node2 指向的节点

    image-20200726110523216

  5. 直至 node1 == null 或者 node2 == null

    image-20200726110805970

  6. 最后链表 2 还有剩余元素,将 preNode 指向 node2 指向的节点,将剩余元素接在新链表的最后image-20200726110901417

3、代码实现

3.1、链表节点定义

//节点class Node {   	public Integer data;	public Node next;	public Node(Integer data) {   		this.data = data;	}	public String toString() {   		return data.toString();	}}

3.2、链表的定义

//链表类class SingleLinkedList {   	public Node head = new Node(0);	public void add(Node node) {   		// 首节点指针不能移动哦,需要定义辅助指针		Node preNode = head;		while (preNode.next != null) {   			preNode = preNode.next;		}		preNode.next = node;	}	public void show() {   		// 首节点指针不能移动哦,需要定义辅助指针		Node curNode = head.next;		while (curNode != null) {   			System.out.print(curNode.data + "-->");			curNode = curNode.next;		}		System.out.println();	}}

3.3、链表合并

public static SingleLinkedList merge(SingleLinkedList list1, SingleLinkedList list2) {       // 新链表的头结点    Node head = new Node(0);    // preNode 指向当前待排序节点的前一个节点    Node preNode = head;    // 设置新链表的头结点    SingleLinkedList mergeList = new SingleLinkedList();    mergeList.head = head;    // node1 初始值默认指向 list1 的首节点    Node node1 = list1.head.next;    // node2 初始值默认指向 list2 的首节点    Node node2 = list2.head.next;    // 当 node1 和 node2 其中一个为 null 时,就代表有一个链表已经到头啦    while (node1 != null && node2 != null) {           // 将值小的节点排在前面(升序排列),并且后移 node1 或 node2 指针        if (node1.data < node2.data) {               preNode.next = node1;            node1 = node1.next;        } else {               preNode.next = node2;            node2 = node2.next;        }        // preNode 后移,为下一次排序做准备        preNode = preNode.next;    }    // 最后链上还有剩余节点的链表    preNode.next = (node1 == null) ? node2 : node1;    // 返回合并后的链表    return mergeList;}

3.4、测试代码

  • 代码
public static void main(String[] args) {       SingleLinkedList list1 = new SingleLinkedList();    list1.add(new Node(1));    list1.add(new Node(3));    list1.add(new Node(5));    list1.add(new Node(7));    list1.add(new Node(9));    SingleLinkedList list2 = new SingleLinkedList();    list2.add(new Node(2));    list2.add(new Node(4));    list2.add(new Node(6));    list2.add(new Node(6));    list2.add(new Node(8));    list2.add(new Node(10));    list2.add(new Node(11));    list2.add(new Node(12));    // 合并链表    SingleLinkedList mergeList = merge(list1, list2);    System.out.println("合并后的链表如下~~~");    mergeList.show();}
  • 程序运行结果
合并后的链表如下~~~1-->2-->3-->4-->5-->6-->6-->7-->8-->9-->10-->11-->12-->

3.5、全部代码

public class MergeList {   	public static void main(String[] args) {   		SingleLinkedList list1 = new SingleLinkedList();		list1.add(new Node(1));		list1.add(new Node(3));		list1.add(new Node(5));		list1.add(new Node(7));		list1.add(new Node(9));		SingleLinkedList list2 = new SingleLinkedList();		list2.add(new Node(2));		list2.add(new Node(4));		list2.add(new Node(6));		list2.add(new Node(6));		list2.add(new Node(8));		list2.add(new Node(10));		list2.add(new Node(11));		list2.add(new Node(12));		// 合并链表		SingleLinkedList mergeList = merge(list1, list2);		System.out.println("合并后的链表如下~~~");		mergeList.show();	}	public static SingleLinkedList merge(SingleLinkedList list1, SingleLinkedList list2) {   		// 新链表的头结点		Node head = new Node(0);		// preNode 指向当前待排序节点的前一个节点		Node preNode = head;		// 设置新链表的头结点		SingleLinkedList mergeList = new SingleLinkedList();		mergeList.head = head;		// node1 初始值默认指向 list1 的首节点		Node node1 = list1.head.next;		// node2 初始值默认指向 list2 的首节点		Node node2 = list2.head.next;		// 当 node1 和 node2 其中一个为 null 时,就代表有一个链表已经到头啦		while (node1 != null && node2 != null) {   			// 将值小的节点排在前面(升序排列),并且后移 node1 或 node2 指针			if (node1.data < node2.data) {   				preNode.next = node1;				node1 = node1.next;			} else {   				preNode.next = node2;				node2 = node2.next;			}			// preNode 后移,为下一次排序做准备			preNode = preNode.next;		}		// 最后链上还有剩余节点的链表		preNode.next = (node1 == null) ? node2 : node1;		// 返回合并后的链表		return mergeList;	}}//链表类class SingleLinkedList {   	public Node head = new Node(0);	public void add(Node node) {   		// 首节点指针不能移动哦,需要定义辅助指针		Node preNode = head;		while (preNode.next != null) {   			preNode = preNode.next;		}		preNode.next = node;	}	public void show() {   		// 首节点指针不能移动哦,需要定义辅助指针		Node curNode = head.next;		while (curNode != null) {   			System.out.print(curNode.data + "-->");			curNode = curNode.next;		}		System.out.println();	}}//节点class Node {   	public Integer data;	public Node next;	public Node(Integer data) {   		this.data = data;	}	public String toString() {   		return data.toString();	}}

转载地址:http://iifc.baihongyu.com/

你可能感兴趣的文章
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>
mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
查看>>
Webpack 基本环境搭建
查看>>
mysql5.7 安装版 表不能输入汉字解决方案
查看>>
MySQL5.7.18主从复制搭建(一主一从)
查看>>
MySQL5.7.19-win64安装启动
查看>>
mysql5.7.19安装图解_mysql5.7.19 winx64解压缩版安装配置教程
查看>>
MySQL5.7.37windows解压版的安装使用
查看>>
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>