package com.interview.leetcode.list; import com.interview.leetcode.utils.ListNode; /** * Created_By: stefanie * Date: 14-11-20 * Time: 下午6:11 */ public class ListSort { static class InsertSort{ public static ListNode sort(ListNode head) { if(head == null || head.next == null) return head; ListNode cur = head.next; head.next = null; while(cur != null){ ListNode next = cur.next; head = insertNode(head, cur); cur = next; } return head; } public static ListNode insertNode(ListNode head, ListNode node){ ListNode dummyNode = new ListNode(0); dummyNode.next = head; head = dummyNode; while(head.next != null && head.next.val <= node.val){ head = head.next; } node.next = head.next; head.next = node; return dummyNode.next; } } static class MergeSort{ public static ListNode sort(ListNode head){ int length = length(head); return sort(head, length); } private static ListNode sort(ListNode head, int length){ if (length == 1) { head.next = null; return head; } ListNode mid = head; for (int i = 0; i < length / 2; i++) mid = mid.next; head = sort(head, length / 2); mid = sort(mid, length - length / 2); return merge(head, mid); } public static ListNode merge(ListNode l1, ListNode l2){ ListNode dummyHead = new ListNode(0); ListNode prev = dummyHead; while(l1 != null && l2 != null){ if(l1.val < l2.val){ prev.next = l1; l1 = l1.next; } else { prev.next = l2; l2 = l2.next; } prev = prev.next; } if(l1 == null) prev.next = l2; else prev.next = l1; return dummyHead.next; } public static int length(ListNode head){ int length = 0; while(head != null){ head = head.next; length++; } return length; } } }