package com.interview.books.leetcodeoj; import com.interview.leetcode.utils.ListNode; /** * Created_By: stefanie * Date: 14-12-28 * Time: 下午2:18 */ public class LOJ148_SortList { //use length to partition the list // 1. find the mid by for(int i = 0; i < length/2; i++) mid = mid.next; // 2. mergesort the first half: head = mergesort(head, length/2); // 3. mergesort the second half: mid = mergesort(mid, length - length/2); // 4. merge the two sorted list using dummy node; //important: when length == 1, set head.next = null and return head public ListNode sortList(ListNode head) { if(head == null || head.next == null) return head; int length = length(head); return mergesort(head, length); } private ListNode mergesort(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 = mergesort(head, length/2); mid = mergesort(mid, length - length/2); return merge(head, mid); } private ListNode merge(ListNode l1, ListNode l2){ ListNode dummy = new ListNode(0); ListNode prev = dummy; 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; } prev.next = l1 != null? l1 : l2; return dummy.next; } private int length(ListNode head){ int length = 0; while(head != null){ head = head.next; length++; } return length; } }