该题解使用插入排序的思想对链表进行排序。具体步骤如下:
1. 首先判断链表是否为空或者只有一个节点,如果是则直接返回。
2. 创建一个虚拟头节点dummy,指向原始链表的头节点。
3. 用last_sorted表示已排序部分的最后一个节点,初始为头节点。
4. 用cur表示当前需要插入的节点,初始为头节点的下一个节点。
5. 遍历cur节点,对于每个cur节点:
- 如果cur节点的值大于last_sorted节点的值,说明cur应该插入到已排序部分的最后,将last_sorted后移一位。
- 否则,从dummy节点开始遍历已排序部分,找到第一个大于cur的节点pre,将cur插入到pre之前。
6. 重复步骤5直到cur为空。
7. 返回dummy.next作为排序后的链表头节点。
时间复杂度: O(n^2)
空间复杂度: O(1)
# 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 head is None or head.next is None:
return head
# 创建虚拟头节点,指向原始链表头
dummy = ListNode(next=head)
# last_sorted是已排序部分的最后一个节点,初始为原始链表头
last_sorted = head
# cur是当前需要插入的节点
cur = head.next
while cur:
# 若cur大于已排序部分的最后一个,则cur应插入到最后
if cur.val > last_sorted.val:
last_sorted = last_sorted.next
else:
# 否则,从链表头开始找第一个大于cur的节点pre
pre = dummy
while pre.next.val < cur.val:
pre = pre.next
# 将cur从原位置移除,插入到pre之后
last_sorted.next = cur.next
cur.next = pre.next
pre.next = cur
cur = last_sorted.next
# 返回排序后的链表的头节点
return dummy.next