147. Insertion Sort List 对链表进行插入排序
1. 原始题目
对链表进行插入排序。

插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3 输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0 输出: -1->0->3->4->5
2. 思路
就是单纯插入排序,前面的序列看作已经该排好序的。每次将当前元素放到已排好序的位置。与数组的插入排序不同的是,链表只能从前往后查找。最坏情况O(n^2)复杂度。
3. 解题
1 class Solution:
2 def insertionSortList(self, head: ListNode) -> ListNode:
3 if not head or not head.next: return head
4 temp = ListNode(0) # 虚拟头节点
5 temp.next = head
6 p = temp # 每次负责找到合适的插入位置
7 cur = head.next # 当前要考虑的接结点
8 while(cur):
9 if cur.val<head.val:
10 while(p.next!=head and p.next.val<cur.val): # 找到该插入的位置
11 p = p.next
12 head.next = cur.next
13 cur.next = p.next
14 p.next = cur
15 p = temp # 结束此轮插入操作后要将p放回原位用于下一次从头搜索
16 cur = head.next
17 else:
18 head = head.next # 如果当前元素比上一个节点大,即递增,则继续往前走
19 cur = cur.next
20 return temp.next

浙公网安备 33010602011771号