排序
①遍历链表,当前遍历的结点记作 
    
     
      
       
        p
       
      
      
       p
      
     
    p 。
 ②从前往后遍历链表,找到最后一个值小于 
    
     
      
       
        p
       
      
      
       p
      
     
    p 的结点 
    
     
      
       
        c
       
       
        u
       
       
        r
       
      
      
       cur
      
     
    cur 。
 ③(关键操作) 插入,如图,将 
    
     
      
       
        p
       
      
      
       p
      
     
    p 插入 
    
     
      
       
        c
       
       
        u
       
       
        r
       
      
      
       cur
      
     
    cur 的后面。
 
p->next = cur->next;
cur->next = p;
p = next;
区分指针 n e x t next next 和 变量 n e x t next next 。指针 n e x t next next 是结点的后继,变量 n e x t next next 是①遍历的下一个位置。
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        auto dummy = new ListNode(-1);
        for(auto p = head;p;){
            auto cur = dummy;
            while(cur->next&&cur->next->val<=p->val) cur = cur->next;
            auto next = p->next;
            p->next = cur->next;
            cur->next = p;
            p = next;
        }
        return dummy -> next;
    }
};
- 时间复杂度 : O ( n 2 ) O(n^2) O(n2) , n n n 是链表长度, 插入排序的时间复杂度 O ( n ) O(n) O(n) 。
- 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常数级空间 。
AC

致语
- 理解思路很重要
- 读者有问题请留言,清墨看到就会回复的。

![[附源码]Python计算机毕业设计Django的图书互换系统](https://img-blog.csdnimg.cn/42eef733e6ba4032bf929e08b9a629b3.png)

















