Featured image of post Insertion Sort List

Insertion Sort List

147. 对链表进行插入排序

分析

  1. 使用一个虚拟头节点 dummy 来方便构建有序链表
  2. 遍历原链表:
    • 对于当前节点 p,从虚拟头节点 dummy 开始查找它应插入的位置
    • 插入后调整指针以确保链表仍然连接正确
  3. 继续处理下一节点,直到原链表遍历结束
  4. 返回排序后的链表

时间复杂度

  • 外层遍历链表,每个节点插入有序链表的过程中需查找插入位置。
  • 最坏情况下(链表反序),插入每个节点需要遍历整个有序链表,时间复杂度为 O(n^2),其中 n 是链表的长度

空间复杂度

空间复杂度为 O(1)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution
{
public:
    ListNode* insertionSortList(ListNode* head)
    {
        // 创建虚拟头节点
        ListNode* dummy = new ListNode(-1);
        ListNode* p = head;

        // 遍历原链表
        while (p)
        {
            // 找到插入点:从 dummy 开始找到第一个大于当前节点值的位置
            ListNode* cur = dummy;
            while (cur->next && cur->next->val <= p->val)
                cur = cur->next;

            // 插入当前节点到有序链表
            ListNode* next = p->next;  // 保存下一个节点
            p->next = cur->next;      // 当前节点指向插入位置后的节点
            cur->next = p;            // 插入当前节点到有序链表
            p = next;                 // 继续处理下一个节点
        }

        // 返回排序后的链表
        return dummy->next;
    }
};
Built with Hugo
Theme Stack designed by Jimmy