对链表进行插入排序
- 判断链表是否为空
- 创建一个哑节点dummyHead,令dummyHead.next=head
设置虚拟头节点是因为元素可能插入到链表头,为了和其他位置操作一致
- lastSorted为链表已排序部分最后一个节点,初始值为lastSorted=head
- curr是待插入的元素,初始值curr=head.next
- 比较lastSorted和curr的节点值
- 若lastSorted.val < = curr.val,说明curr应该位于lastSorted之后,将lastSorted后移一位,curr即为新的lastSorted
- **若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