链表排序
来源:互联网 发布:机器人离线编程培训班 编辑:程序博客网 时间:2024/06/06 12:26
<p>对链表进行合并算法排序,基本思路和merge算法一下。</p><p>一下是Java实现:</p><div></div>
public class ListNode{int val;ListNode next;ListNode(int val){this(val, null);}ListNode(int val, ListNode next){this.val = val;this.next = next;}}public class Util{public static void printList(ListNode head){ListNode node = head;StringBuilder builder = new StringBuilder();while(node != null){builder.append(node.val + " ");node = node.next;}System.out.println(builder.toString().trim());}}public class MergeSortList{public static void main(String[] args){int[] arr = {1,3,3,1,3,1,3,3,2,3,2,2,1,1,2,3};ListNode head = null, tail = null;for(int i = 0; i < arr.length; i++){if(head == null) {head = new ListNode(arr[i]);tail = head;}else{tail.next = new ListNode(arr[i]);tail = tail.next;}}Util.printList(head);ListNode m = new MergeSortList().sort(head);Util.printList(m);}public ListNode sort(ListNode head){if(head == null || head.next == null) return head;ListNode hnode = head;ListNode lnode = split(hnode);hnode = sort(hnode);lnode = sort(lnode);ListNode m = merge(hnode, lnode);return m;}/** * Merge to sorted list * */public ListNode merge(ListNode alist, ListNode blist){if(alist == null) return blist;if(blist == null) return alist;ListNode rvl = null;ListNode tmp = null;if(alist.val <= blist.val){tmp = alist.next;rvl = alist;rvl.next = merge(tmp, blist);}else{tmp = blist.next;rvl = blist;rvl.next = merge(alist, tmp);}return rvl;}public ListNode split(ListNode head){ListNode fast;ListNode slow;if(null == head || null == head.next){return null;}slow = head;fast = head.next;while(fast != null){fast = fast.next;if(fast != null){slow = slow.next;fast = fast.next;}}ListNode low = slow.next;slow.next = null;return low;}}
输出结果:
1 3 3 1 3 1 3 3 2 3 2 2 1 1 2 3
1 1 1 1 1 2 2 2 2 3 3 3 3 3 3 3
0 0
- 链表排序 归并排序
- 链表排序--选择排序
- 链表排序--快速排序
- 链表排序--归并排序
- 排序3:插入排序(普通插入排序 + 折半插入排序 + 链表插入排序 + 希尔排序)
- LIST排序, Struct排序, qsort排序, STL::LIST sort排序, 链表排序
- 单向链表排序:快速排序和归并排序
- 单向链表排序-归并排序
- 链表排序,使用插入排序,
- 链表排序-直接插入排序
- 链表的一种排序---冒泡排序
- c 链表排序 - 选择排序
- 链表排序之插入排序
- 插入排序进行链表排序
- 优化冒泡排序 & 链表选择排序
- 链表排序之选择排序
- 链表排序之冒泡排序
- 链表排序(归并排序)
- Linux下的awk使用详解
- 内核常用对象/结构收集
- .Net程序员玩转Android开发---(8)表格布局TableLayout
- 传统字符串匹配算法--Brute Force算法的C代码实现
- ListCtrl Checkbox多选问题
- 链表排序
- HLG 2163 方格取数 (最大网络流)
- asp.net--CSS权限等级
- 弱联网手游如何防作弊?
- this指针 operator* 解析
- Makefile include指示符
- unity 2D 多边形碰撞框编辑修改
- .Net程序员玩转Android开发---(9)绝对布局AbsoluteLayout
- 提高工作效率:15个有用的项目管理工具