147. 对链表进行插入排序
思路:
与数组插入排序的思路相同,都是先有一个有序序列,然后拿着待插入元素,在有序序列中找到正确的位置;
链表有序序列的初始化方式就是,先定义一个哨兵dummyNode,然后让head节点成为第一个有序的序列的元素,维护一个lastSortNode保存有序序列的最后一个元素。
其实就相当于从第一个元素开始每次拿有序序列的后边一个元素,放到正确的位置上,最后让所有的链表都有序了。
https://leetcode-cn.com/problems/insertion-sort-list/solution/dui-lian-biao-jin-xing-cha-ru-pai-xu-by-leetcode-s/
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */ class Solution { public ListNode insertionSortList(ListNode head) { ListNode dummyHead = new ListNode(0); dummyHead.next = head; ListNode lastSorted = head; ListNode cur = head.next; while (cur != null) { if (lastSorted.val < cur.val) { lastSorted = lastSorted.next; } else { // 从前往后找到合适的位置,将cur元素插入到链表中 ListNode pre = dummyHead; while (cur.val > pre.next.val) { pre = pre.next; } // 将cur从原来的链表中删除 lastSorted.next = cur.next; // 将cur添加到新排序链表中 cur.next = pre.next; pre.next = cur; } cur = lastSorted.next; } return dummyHead.next; } }
。。