博客
关于我
合并两个有序链表
阅读量: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/

你可能感兴趣的文章
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>