题目
链接:leetcode-cn.com/problems/in…
思考
插入排序是三大简单排序中的一种,伪代码如下:
INSERTION-SORT(A) //A是数组
for j = 2 to A.length
key = A[j]
//(将A[j]插入排序序列A[1..j-1])
i = j - 1
while i > 0 and A[i] > key
A[i+1] = A[i]
i = i - 1
A[i+1] = key
在插入排序的模版中,搜索A[j]的位置时,我们从后往前地遍历,搜索的同时把每个数字往后移动一位。这道题目基本不需要改动插入排序模版,只是在链表中我们必须从头开始搜索。
题解
下面的代码中prevNode指向的代表模版中的排序序列A[1...j-1],head就是模版外层循环的j = 2 to A.length。while prevNode.next and prevNode.next.val < head.val:这段循环之后,prevNode就是小于head的最后一个结点。此时,prevNode.val < head.val < prevNode.next.val。因此,head指向比它大的元素prevNode.next,prevNode指向head。需要注意的是,在对链表进行操作前,得先把head的下一个元素储存在nxt中,在链表操作结束后让head = nxt,这样才能保证循环的进行。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def insertionSortList(self, head: ListNode) -> ListNode:
if not head: return head
dummy = ListNode(0)
prev = head
while head:
prevNode = dummy
while prevNode.next and prevNode.next.val < head.val:
prevNode = prevNode.next
nxt = head.next
head.next = prevNode.next
prevNode.next = head
head = nxt
return dummy.next