思路:
1.如果链表为空,则返回其本身;
2.如果链表不为空,初始化排序表最后指针lastsorted为head,当前需排序的指针curr为head->next;
3.为了方便将元素插入到head之前,设立Head_front指针,值设为0,指向head;
4.初始化完成后,对排好序的表利用指针prev进行遍历查找,找到适合插入的位置;
ListNode *prev = Head_front;
while (prev->next->val <= curr->val)
prev = prev->next;
5.将需排序元素curr原地删除,插入新的位置中;
lastSorted->next = curr->next;
curr->next = prev->next;
prev->next = curr;
6.循环4和5步骤,直到curr为nullptr,最后需要返回链表头元素,return Head_front->next;
代码:
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if (head == nullptr)
return head;
ListNode* Head_front = new ListNode(0,head);
ListNode* lastSorted = head;
ListNode* curr = head->next;
while (curr != nullptr) {
//当前值大于排好序的表的最后一个值
if (lastSorted->val <= curr->val)
lastSorted = lastSorted->next;
//当前值在排好序表中排列在之前或中间
else {
ListNode *prev = Head_front;
//寻找最佳插入位置
while (prev->next->val <= curr->val)
prev = prev->next;
//删除和插入操作
lastSorted->next = curr->next;
curr->next = prev->next;
prev->next = curr;
}
//进行下一个元素的排序
curr = lastSorted->next;
}
return Head_front->next;
}
};
时间复杂度 | 空间复杂度 |
---|---|
O(n2) | O(1) |