147。对链表进行插入排序

对链表进行插入排序

在这里插入图片描述

  • 判断链表是否为空
  • 创建一个哑节点dummyHead,令dummyHead.next=head

设置虚拟头节点是因为元素可能插入到链表头,为了和其他位置操作一致

  • lastSorted为链表已排序部分最后一个节点,初始值为lastSorted=head
  • curr是待插入的元素,初始值curr=head.next
  • 比较lastSorted和curr的节点值
  1. 若lastSorted.val < = curr.val,说明curr应该位于lastSorted之后,将lastSorted后移一位,curr即为新的lastSorted
  2. **若lastSorted.val > curr.val,则需要从链表的头节点开始往后遍历,寻找插入curr的位置,令prev为插入curr位置的前一个节点

pre:一是与当前节点做比较,二是让交换之后的curr回到prev后面``

进行以下操作,完成对curr的插入:**

lastSorted.next=curr.next
curr.next = prev.next
prev.next = curr
  • 令curr = lastSorted.next,此时curr为下一个待插入的值
  • 重复前两步,直至curr变为空,排序结束
  • 返回dummyHead.next,为排序后的链表的头节点
class Solution:
    def insertionSortList(self, head: ListNode) -> ListNode:
        if not head :
            return head
        dummyHead = ListNode(0)
        dummyHead.next =head
        lastHead = head
        curr = head.next
        while curr:
            if lastHead.val <=  curr.val:
                lastHead = lastHead.next
            
            else:
                prev = dummyHead
                while prev.next.val <= curr.val:
                    prev = prev.next
                lastHead.next = curr.next
                curr.next = prev.next
                prev.next = curr
            curr = lastHead.next
        return dummyHead.next

以下是来自leetcode一个更通俗易懂的解释:

首先找到待插入的节点,比较前一个节点值与当前节点值的大小,若当前节点值小,则移除,移除前保存至一个prev节点
将prev节点插入到合适的位置(从头开始遍历比较)

prev
dummy prev.next
0 -> -1 -> 5 -> 4 -> 0
temp
3 -> 4 -> 0

dummy prev prev.next
0 -> -1 -> 5 -> 4 -> 0

一旦 prev.next.val > temp.val ,temp 插入到 prev 和 prev.next 之间

dummy prev temp prev.next
0 -> -1 -> 3 -> 5 -> 4 -> 0

链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值