lc-147


给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头

插入排序 算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
  3. 重复直到所有输入数据插入完为止。

下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。

对链表进行插入排序。

img

示例 1:

img

输入: head = [4,2,1,3]
输出: [1,2,3,4]

示例 2:

img

输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]

提示:

  • 列表中的节点数在 [1, 5000]范围内
  • -5000 <= Node.val <= 5000

//leetcode submit region begin(Prohibit modification and deletion)
/**
 * 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 newHead = null;
        ListNode newTail = null;
        ListNode curHead = head;

        while (curHead != null) {
            int minV = Integer.MAX_VALUE;
            ListNode minN = null;
            ListNode minPre = null;
            ListNode node = curHead;
            ListNode pre = null;

            while (node != null) {
                if (node.val < minV) {
                    minN = node;
                    minPre = pre;
                    minV = node.val;
                }
                pre = node;
                node = node.next;
            }
            if (minPre == null) {
                curHead = curHead.next;
            } else {
                minPre.next = minN.next;
            }
            if (newHead == null) {
                newHead = minN;
            } else {
                newTail.next = minN;
            }
            newTail = minN;
        }

        if (newTail != null) {
            newTail.next = null;
        }

        return newHead;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !