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

你可能感兴趣的文章
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>