把链表分为两部分,一部分是已经排序的链表,另一部分是还未排序的链表。每次把未排序的链表的头节点插入到已排序链表中,直到未排序链表为空为止。
时间复杂度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;
}
京公网安备 11010502036488号