友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

147. 对链表进行插入排序

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

插入排序 算法的步骤:

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。

  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。

  3. 重复直到所有输入数据插入完为止。

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

对链表进行插入排序。

0147 01

示例 1:

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

示例 2:

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

提示:

  • 列表中的节点数在 `[1, 5000]`范围内

  • -5000 <= Node.val <= 5000

思路分析

首先建立虚拟头节点(头结点的值要足够小),然后从头节点向后遍历,遇到当前值比前一个节点值小,则把这个值摘出来,从头结点向后寻找插入位置。

另外,只有在当前节点比前一个节点大时才需要向后移动当前节点。当大小相反时,因为把当前节点摘出来了,前一个节点的下一个节点的值已经发生了变化。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-06-26 21:56:34
 */
public ListNode insertionSortList(ListNode head) {
  ListNode dummy = new ListNode(Integer.MIN_VALUE);
  dummy.next = head;
  ListNode prev = dummy;
  while (prev.next != null) {
    ListNode curr = prev.next;
    if (curr.val < prev.val) {
      prev.next = curr.next;
      ListNode first = dummy;
      while (first.next.val < curr.val) {
        first = first.next;
      }
      curr.next = first.next;
      first.next = curr;
    } else {
      prev = prev.next;
    }
  }
  return dummy.next;
}