题目概述
思路
思路很简单,与数组的插入排序类似,使用一个lastsortedlastsortedlastsorted指针表示已经被排到有序的部分链表的尾结点的指针,使用curcurcur指针来指向当前正在检查的节点,如果cur−>valcur->valcur−>val大于等于lastsorted−>vallastsorted->vallastsorted−>val,那么直接把cur指的值插入到我们的有序链表中就行,也就是让lastsorted=lastsorted−>next;cur=lastsorted−>next;lastsorted = lastsorted->next; cur = lastsorted->next;lastsorted=lastsorted−>next;cur=lastsorted−>next;如果cur−>valcur->valcur−>val小于lastsorted−>vallastsorted->vallastsorted−>val那么就用findlocationfindlocationfindlocation指针和supsupsup指针来从头开始找到合适的位置进行一个结点的插入,为了让cur能回到下一个结点,同时也相当于把curcurcur目前所指结点从lastsortedlastsortedlastsorted的nextnextnext卸下来,让lastsorted−>next=cur−>nextlastsorted->next = cur->nextlastsorted−>next=cur−>next,这样存储好curcurcur本来的nextnextnext.
代码:
class Solution {
public:
ListNode* insertionSortList(ListNode* head)
{
if (head == nullptr || head->next == nullptr)
{
return head;
}
ListNode* cur = head->next;
ListNode* dummyhead = new ListNode(0, head);
ListNode* lastsorted = head;
while (cur != nullptr)
{
if (cur->val >= lastsorted->val)
{
lastsorted = lastsorted->next;
}
else
{
lastsorted->next = cur->next;
ListNode* findlocation = dummyhead->next;
ListNode* prevsup = dummyhead;
while (findlocation->val < cur->val)
{
findlocation = findlocation->next;
prevsup = prevsup->next;
}
prevsup->next = cur;
cur->next = findlocation;
}
cur = lastsorted->next;
}
ListNode* ret = dummyhead->next;
delete dummyhead;
return ret;
}
};