归并排序Merge Sort LinkedList in Java
2015-08-25 10:38
465 查看
Merge Sort LinkedList in Java
package algorithm.sort; class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } public class SortLinkedList { // merge sort public static ListNode mergeSortList(ListNode head) { if (head == null || head.next == null) return head; // count total number of elements int count = 0; ListNode p = head; while (p != null) { count++; p = p.next; } // break up to two list int middle = count / 2; ListNode l = head, r = null; ListNode p2 = head; int countHalf = 0; while (p2 != null) { countHalf++; ListNode next = p2.next; if (countHalf == middle) { p2.next = null; r = next; } p2 = next; } // now we have two parts l and r, recursively sort them ListNode h1 = mergeSortList(l); ListNode h2 = mergeSortList(r); // merge together ListNode merged = merge(h1, h2); return merged; } public static ListNode merge(ListNode l, ListNode r) { ListNode p1 = l; ListNode p2 = r; ListNode fakeHead = new ListNode(100); ListNode pNew = fakeHead; while (p1 != null || p2 != null) { if (p1 == null) { pNew.next = new ListNode(p2.val); p2 = p2.next; pNew = pNew.next; } else if (p2 == null) { pNew.next = new ListNode(p1.val); p1 = p1.next; pNew = pNew.next; } else { if (p1.val < p2.val) { // if(fakeHead) pNew.next = new ListNode(p1.val); p1 = p1.next; pNew = pNew.next; } else if (p1.val == p2.val) { pNew.next = new ListNode(p1.val); pNew.next.next = new ListNode(p1.val); pNew = pNew.next.next; p1 = p1.next; p2 = p2.next; } else { pNew.next = new ListNode(p2.val); p2 = p2.next; pNew = pNew.next; } } } // printList(fakeHead.next); return fakeHead.next; } public static void main(String[] args) { ListNode n1 = new ListNode(2); ListNode n2 = new ListNode(3); ListNode n3 = new ListNode(4); ListNode n4 = new ListNode(3); ListNode n5 = new ListNode(4); ListNode n6 = new ListNode(5); n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; n5.next = n6; n1 = mergeSortList(n1); printList(n1); } public static void printList(ListNode x) { if(x != null){ System.out.print(x.val + " "); while (x.next != null) { System.out.print(x.next.val + " "); x = x.next; } System.out.println(); } } }
相关文章推荐
- Java 生产者模式 消费者模式
- JAVA基础8(代码剖析)
- java中日期工具类
- 《Java实战开发经典》第五章5.3
- Java IO流->节点流->字节流:FileInputStream与FileOutputStream
- Eclipse快捷键大全
- Java总结
- SpringMVC单元测试
- eclipse 插件安装
- java内存分配分析/栈内存、堆内存
- 【JAVA】WEB开发实际任务——记录
- 深入理解Java的接口和抽象类
- Java程序性能优化
- 学习笔记:JAVA RMI远程方法调用简单实例
- java.lang.NoClassDefFoundError:的处理
- volatile关键字
- 《Java实战开发经典》第五章5.2
- java发送邮件
- Java @注解
- 【Java EE 学习 30】【闪回】【导入导出】【管理用户安全】【分布式数据库】【数据字典】【方案】