public static ListNode insertionSortList(ListNode head) {//passed but exceeded time limit
        ListNode p1 = head.next;
        ListNode prev = head;

        ListNode new_head = new ListNode(0x80000000);
        ListNode temp = new ListNode(head.val);
        new_head.next = temp;
        while (p1 != null) {
            prev.next = p1.next;
            ListNode p2_prev = new_head;
            ListNode p2 = new_head.next;
            for (; p2 != null; p2 = p2.next, p2_prev = p2_prev.next) {
                System.out.println("Oh" + p1.val);
                if (p1.val < p2.val) {
                    p2_prev.next = p1;
                    p1.next = p2;
                    break;
                }
            }
            if (p2 == null) {//p2 is at the tail. Insert after
                p2_prev.next = p1;
            }
            //now, decide whether to continue or not
            if (prev.next != null) {
                p1 = prev.next;
            }
            else {//no more node
                break;
            }
        }
        ListNode t = new_head.next;
        while (t != null) {
            System.out.println(t.val);
            t = t.next;
        }
        return new_head.next;
    }