/** Sort a linked list using insertion sort. */
public class InsertionSortList {
  public ListNode insertionSortList(ListNode head) {
    ListNode ret = new ListNode(Integer.MIN_VALUE);
    ListNode result = ret;
    ListNode cur = new ListNode(0);
    cur.next = head;
    while (cur.next != null) {
      while (result.next != null && cur.next.val > result.next.val) {
        result = result.next;
      }
      ListNode tmp = cur.next;
      cur.next = cur.next.next;
      if (result.next == null) {
        result.next = tmp;
        tmp.next = null;
      } else {
        ListNode tmp2 = result.next;
        result.next = tmp;
        tmp.next = tmp2;
      }
      result = ret;
    }
    return result.next;
  }
}