☆☆☆思路:关键点是每次从前往后寻找插入位置。
class Solution { /** * 每次拿出未排序的节点,先和前驱比较,如果大于或者等于前驱,就不用排序了,直接进入下一次循环 * 如果前驱小,则进入内层循环,每次从头开始比较,插入对应位置即可。 */ public ListNode insertionSortList(ListNode head) { if (head == null || head.next == null) return head; ListNode dummyHead = new ListNode(-1); dummyHead.next = head; ListNode pre = head, cur = head.next; while (cur != null) { if (cur.val >= pre.val) { pre = cur; cur = cur.next; continue; } ListNode p = dummyHead; while (p.next.val <= cur.val) { p = p.next; } pre.next = cur.next; // 把 cur 插在 p 和 p.next 之间 cur.next = p.next; p.next = cur; cur = pre.next; } return dummyHead.next; } }