0
点赞
收藏
分享

微信扫一扫

leetcode 147 对链表进行插入排序

绪风 2022-03-13 阅读 43

给定单个链表的头 head ,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
输入: head = [4,2,1,3]
输出: [1,2,3,4]

插入排序的基本思想是,维护一个有序序列,初始时有序序列只有一个元素,每次将一个新的元素插入到有序序列中,将有序序列的长度增加 ,直到全部元素都加入到有序序列中。

如果是数组的插入排序,从第二个元素开始往后遍历,当前元素的前面部分是有序序列,每次在有序序列中找到一个插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将当前元素置于该插入位置。数组涉及移动元素,所以寻找插入位置的时候是从后往前找的,找一个右移一位。对于单向链表而言,只有指向后一个节点的指针,也只能从链表的头节点开始往后遍历链表中的节点,寻找插入位置。对于链表而言,不存在平移的问题,因此从前往后找也可以。时间复杂度是 O(n2)。

对链表进行插入排序的具体过程如下。
首先判断给定的链表是否为空,若为空,则不需要进行排序,直接返回。

1 创建哑节点 dummyHead,令 dummyHead.next = head。引入哑节点是为了便于在 head 节点之前插入节点。

2 维护 lastSorted 为链表的已排序部分的最后一个节点,比较 lastSorted 和 curr 的节点值:
2.1 若 lastSorted.val <= curr.val,说明 curr 应该位于 lastSorted 之后,将 lastSorted 后移一位,curr 变成新的 lastSorted。继续遍历
2.2 否则,从链表的头节点开始往后遍历链表中的节点,寻找插入 curr 的位置。令cur_compare 为插入 curr 的位置的前一个节点,进行如下操作,完成对 curr 的插入:
lastSorted.next = curr.next
curr.next = cur_compare.next
cur_compare.next = curr
令 curr = lastSorted.next,此时 curr 为下一个待插入的元素。继续遍历

3 直到 curr 变成空,排序结束。

4 返回 dummyHead.next,为排序后的链表的头节点。

# 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(next=head)
        cur = head.next
        last_sorted = head
        while cur:
            temp = cur.val
            cur_compare = dummy
            if cur.val >= last_sorted.val:
                last_sorted = cur
                cur = cur.next
                continue
            while cur_compare.next != cur:
                if cur_compare.next.val < temp:
                    cur_compare = cur_compare.next
                else:
                    last_sorted.next = cur.next 
                    cur.next = cur_compare.next
                    cur_compare.next = cur
                    break
            cur = last_sorted.next 
        return dummy.next  
        
        
举报

相关推荐

0 条评论