【力扣上岸】第147题 对链表进行插入排序

223 阅读1分钟

题目

链接: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

参考资料

[1] blog.csdn.net/weixin_4336…