仅作为备注, 便于自己回顾.

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实现的更多相关文章

  1. 两个有序数组合并成一个有序数组(要求时间复杂度为O(n))

    面试题: 怎样把两个有序数组合并成有序数组呢 逻辑步骤: 1.假设两个数组为A和B 2.A和B都是从小到大的顺序进行排列 ** 1.我们可以直接比较两个数组的首元素,哪个小就把这个小元素放入可变数组. ...

  2. 合并k个有序数组

    给定K个有序数组,每个数组有n个元素,想把这些数组合并成一个有序数组 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创建一个大小为n*k的数组保存最后的结果创建一个大小为k的最小 ...

  3. 2、java数据结构和算法:单链表: 反转,逆序打印, 合并二个有序链表,获取倒数第n个节点, 链表的有序插入

    什么也不说, 直接上代码: 功能点有: 1, 获取尾结点 2, 添加(添加节点到链表的最后面) 3, 添加(根据节点的no(排名)的大小, 有序添加) 4, 单向链表的 遍历 5, 链表的长度 6, ...

  4. c# 有序链表合并 链表反转

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  6. 【LeetCode每天一题】 Merge k Sorted Lists(合并K个有序链表)

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...

  7. java合并两个升序数组为一个新的有序数组

    转自:http://blog.csdn.net/laozhaokun/article/details/37531247 题目:有两个有序数组a,b,现需要将其合并成一个新的有序数组. 简单的思路就是先 ...

  8. [剑指offer] 14. 链表中倒数第K个节点+翻转+逆序打印+合并两个排序链表 + 链表相交(第一个公共节点) (链表)

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:  两个指针,起始位置都是从链表头开始,第一个比第二个先走K个节点,当第一个走到链表尾时,第二个指针的位置就是倒数第k个节点.(两指针始终相 ...

  9. [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 ...

随机推荐

  1. 使用MySQL Proxy和MySQL Replication实现读写分离

    MySQL Replication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力.那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave ...

  2. jQuery CSS()方法改变CSS样式实例解析

    转自:http://www.jbxue.com/article/24588.html 分享一个jQuery入门实例:使用CSS()方法改变现有的CSS样式表,css()方法在使用上具有多样性.其中有一 ...

  3. javascript基础拾遗(五)

    1.什么是箭头函数 ES6引入的一种新的函数,类似匿名函数,x=>xx 箭头左端为函数参数,右端为函数体 相当于 function (x){ retutn xx } 2.箭头函数的特点 更简洁 ...

  4. 17、uwp 打包失败记录

    今天在打包时,总是打包失败, visual studio 报错误: 严重性 说明 代码 项目 文件 行 禁止显示状态错误 Error info: error 80080204: All app pac ...

  5. ZendStudio在kali下无法启动

    错误如下 # # A fatal error has been detected by the Java Runtime Environment: # #  SIGSEGV (0xb) at pc=0 ...

  6. qs文档翻译

    安装: npm install qs --save-dev 基本用法: let qs = require('qs'); let assert = require('assert'); //qs.par ...

  7. web spring 容器

    使用spring的web应用时,不用手动创建spring容器,而是通过配置文件声明式地创建spring容器,因此,在web应用中创建spring容器有如下两种方式: 一.直接在web.xml文件中配置 ...

  8. java中编码种类和区别

    为什么要编码 不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码?要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言.由于人类的语言有太 ...

  9. 插入中国所有省和市的SQL语句--以后用

    需要做根据省市过滤查询的,不得已写入数据库,这个留着方便以后用. 首先创建两张表 drop database if exists BSM; create database BSM; use BSM; ...

  10. 加快Terminal的打开加载速度

    加快Terminal的打开加载速度html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirr ...