147. Insertion Sort List 对链表进行插入排序

1. 原始题目

对链表进行插入排序。


插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。

 

插入排序算法:

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

 

示例 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

 

posted @ 2019-05-11 11:26  三年一梦  阅读(232)  评论(0)    收藏  举报