把链表分为两部分,一部分是已经排序的链表,另一部分是还未排序的链表。每次把未排序的链表的头节点插入到已排序链表中,直到未排序链表为空为止。
时间复杂度O(n^2),空间复杂度O(1)。

ListNode* insertionSortList(ListNode* head) {
    if (head == nullptr || head->next == nullptr) {
        return head;
    }
    ListNode* temp_head = new ListNode(-1);    //新增一个节点插在头节点前
    temp_head->next = head;
    ListNode* pNode = head->next;    //当前要排序的节点
    head->next = nullptr;            //断开head节点与后面节点的连接,把链表分为两部分,分别以temp_head和pNode为头节点
    while (pNode) {
        //在已排序链表中寻找插入位置
        ListNode* pTemp = temp_head->next;    //pTemp指向已排序部分的第一个节点
        ListNode* pPreTemp = temp_head;    //pPreTemp是pTemp的前一个节点
        while (pTemp && pTemp->val <= pNode->val) {
            pTemp = pTemp->next;
            pPreTemp = pPreTemp->next;
        }        //循环结束时pTemp是已排序链表中第一个大于pNode的节点

        //在把pNode插入到pTemp前之前,需要先断开pNode与其他节点的连接
        ListNode* pNext = pNode->next;
        pNode->next = nullptr;

        //把pNode插入到pPreTemp 和pTemp之间
        pPreTemp->next = pNode;
        pNode->next = pTemp;

        pNode = pNext;    //pNode右移
    }
    return temp_head->next;
}