分类:链表
难度:medium
方法:指针加速
- 对链表进行插入排序
对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
题解
使用一个prev指针指向上次插入的位置,每次比较这个位置的值是否大于当前值,如果大于,则从头遍历,如果小于可以直接从这个位置遍历
代码
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def insertionSortList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
res = ListNode(-1)
prev = res
cur1 = None
cur2 = head
while cur2:
cur1 = cur2
cur2 = cur2.next
if cur1.val<prev.val:
prev = res
while prev.next and cur1.val>prev.next.val:
prev = prev.next
cur1.next = prev.next
prev.next = cur1
return res.next