两个有序单链表合并成一个有序单链表的java实现
仅作为备注, 便于自己回顾.
import java.util.Arrays;
public class MergeSort {
public static class LinkedNode<V extends Comparable<V>> {
public V value;
public LinkedNode<V> next;
public LinkedNode(V value) {
this.value = value;
}
public LinkedNode(V value, LinkedNode<V> next) {
this.value = value;
this.next = next;
}
}
public static <T extends Comparable<T>> LinkedNode<T> prepareSortedLinkedList(T...list) {
Arrays.sort(list);
LinkedNode<T> head = new LinkedNode<>(list[0]);
LinkedNode<T> begin = head;
for (int i = 1; i < list.length; i++) {
begin.next = new LinkedNode<>(list[i]);
begin = begin.next;
}
return head;
}
public static <T extends Comparable<T>> LinkedNode<T> cloneLinkedList(LinkedNode<T> head) {
if (head == null) {
return null;
}
LinkedNode<T> result = new LinkedNode<>(head.value);
LinkedNode<T> clonedList = result;
while (true) {
head = head.next;
if (head != null) {
clonedList.next = new LinkedNode<>(head.value);
clonedList = clonedList.next;
} else {
break;
}
}
return result;
}
public static <T extends Comparable<T>> void dumpLinkedList(LinkedNode<T> head) {
while (true) {
if (head != null) {
System.out.print(String.valueOf(head.value) + ' ');
} else {
break;
}
head = head.next;
}
System.out.println();
}
public static void main(String[] args) {
LinkedNode<String> head11 = prepareSortedLinkedList("dump", "just", "found", "get");
LinkedNode<String> head21 = cloneLinkedList(head11);
dumpLinkedList(head11);
System.out.println("-------------------------------------------");
dumpLinkedList(head21);
System.out.println("-------------------------------------------");
LinkedNode<String> head12 = prepareSortedLinkedList("get", "zara", "yes", "but", "row", "ok", "another");
LinkedNode<String> head22 = cloneLinkedList(head12);
dumpLinkedList(head12);
System.out.println("-------------------------------------------");
dumpLinkedList(head22);
// end prepare
System.out.println("\n++++++++++++++++++++++++++++++++++++++++++\n");
// start test
LinkedNode<String> result1 = mergeSortedLinkedList1(head11, head12);
dumpLinkedList(result1);
System.out.println("-------------------------------------------");
LinkedNode<String> result2 = mergeSortedLinkedList2(head21, head22);
dumpLinkedList(result2);
}
/** recusive. return head node as ascending. will change parameters, non reentrant. */
public static <T extends Comparable<T>> LinkedNode<T> mergeSortedLinkedList1(LinkedNode<T> a, LinkedNode<T> b) {
LinkedNode<T> head;
if (a == null) {
return b;
}
if (b == null) {
return a;
}
if (isFirstLessThanSecond(a.value, b.value)) {
head = a;
head.next = mergeSortedLinkedList1(a.next, b);
} else {
head = b;
head.next = mergeSortedLinkedList1(a, b.next);
}
return head;
}
/** virtual node + loop. return head node as ascending. will change parameters, non reentrant. */
public static <T extends Comparable<T>> LinkedNode<T> mergeSortedLinkedList2(LinkedNode<T> a, LinkedNode<T> b) {
LinkedNode<T> header = null, head = null;
if (a == null) {
return b;
}
if (b == null) {
return a;
}
while (true) {
if (isFirstLessThanSecond(a.value, b.value)) {
if (head == null) {
header = head = a;
} else {
head.next = a;
head = head.next;
}
a = a.next;
} else {
if (head == null) {
header = head = b;
} else {
head.next = b;
head = head.next;
}
b = b.next;
}
if (a == null) {
head.next = b;
break;
} else if (b == null) {
head.next = a;
break;
}
}
return header;
}
/**
* 1. null is smallest;
* 2. if first == null && second == null then return true;
* 3. if first equals second then return false;
*/
private static <T extends Comparable<T>> boolean isFirstLessThanSecond(T first, T second) {
if (first == null) {
return true;
}
if (second == null) {
return false;
}
return first.compareTo(second) < 0;
}
}
两个有序单链表合并成一个有序单链表的java实现的更多相关文章
- 两个有序数组合并成一个有序数组(要求时间复杂度为O(n))
面试题: 怎样把两个有序数组合并成有序数组呢 逻辑步骤: 1.假设两个数组为A和B 2.A和B都是从小到大的顺序进行排列 ** 1.我们可以直接比较两个数组的首元素,哪个小就把这个小元素放入可变数组. ...
- 合并k个有序数组
给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为n*k的数组保存最后的结果创建一个大小为k的最小 ...
- 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入
什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...
- c# 有序链表合并 链表反转
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- java合并两个升序数组为一个新的有序数组
转自:http://blog.csdn.net/laozhaokun/article/details/37531247 题目:有两个有序数组a,b,现需要将其合并成一个新的有序数组. 简单的思路就是先 ...
- [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...
- [LeetCode] 23. Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
随机推荐
- python2和Python3异同总结
1. python3 异常不再接收逗号(,)作为参数: ## python3 中这样可以正常运行 try: print("在这里执行的代码,有异常进入except") except ...
- Tornado使用-简介
1.什么是Tornado Tornado是一个python web框架,和一个异步网络通信库. 因为它的非阻塞网络IO,可同时支撑万级别的连接请求. 适用于长轮询,全双工websocket通信. 2. ...
- 【Fiddler】Fiddler抓包
简述 在调试H5页面.APP的网络请求时,常用Fiddler进行抓包,查看网络报文是否如我们设想.当然,Fiddler也可对我们电脑端发出HTTP请求进行抓包. Fiddler是以代理的形式运行的,即 ...
- 项目日志的管理和应用 log4js-Node.js中的日志管理模块使用与封装
开发过程中,日志记录是必不可少的事情,尤其是生产系统中经常无法调试,因此日志就成了重要的调试信息来源. Node.js,已经有现成的开源日志模块,就是log4js,源码地址:点击打开链接 项目引用方法 ...
- 【word2vec】Distributed Representation——词向量
Distributed Representation 这种表示,它最早是 Hinton 于 1986 年提出的,可以克服 one-hot representation 的缺点. 其基本想法是: 通过训 ...
- html5 class
指向样式表中的类比如<span class="left_menu important">...</span>表示这个span的样式,由样式表中的left_m ...
- STM32内部flash存储小数——别样的C语言技巧
今天在进行STM32内部falsh存储的时候,发现固件库历程的函数原型是这样的: 第一个是地址,在我的STM32中是2K一页的,第二个是要写入的数据. 问题就来了,存储一个小数该怎么办呢?固件库给的是 ...
- DLL封装Interface(接口)(D2007+win764位)
相关资料: http://blog.csdn.net/liangpei2008/article/details/5394911 结果注意: 1.函数的传参方向必须一至. DLL实例代码: ZJQInt ...
- Phrase-Based & Neural Unsupervised Machine Translation基于短语非监督机器翻译
1. 前言 本文介绍一种无监督的机器翻译的模型.无监督机器翻译最早是<UNSUPERVISED NEURAL MACHINE TRANSLATION>提出.这个模型主要的特点,无需使用平行 ...
- Php.ini 文件位置在哪里,怎么找到 php.ini
Php.ini 文件不是经常用到的,突然有一天,你需要修改它了,却不知道他躲在哪里,怎么破? 一般情况下,它会呆在php的安装目录里. 方法/步骤 1 在你自己的网站目录里,新建一个php文件,写 ...