147. Insertion Sort List
思路:
我们需要一个指向已排序链表的最后一个元素的指针lastsort,一个cur指针指向当前用来排序的元素。为了避免head被改变导致错误,还需要一个dummy指针指向head。
首先lastsort指向head,cur指向head->next。然后遍历链表,判断lastsort是否小于cur,如果小于,说明dummy->next到cur就是有序的,就不用对cur进行排序处理,并且将lastsort=lastsort->next。如果lastsort大于cur,说明cur应该被排序。因为dummy到lastsort是已经排好序的,所以我们在声明一个pre指针用来找到排序好的链表中最后一个小于cur的元素,当找到这个元素后,移动cur将会丢失下一个没排序的元素,所以将lastsort->next=cur->next,用来记录下一个未排序的元素,最后就把cur插入进去即可。
当cur排好序后,cur指的位置小于等于lastsort指的位置,而lastsort->next就为cur改变之前的cur->next元素,我们就将cur指向lastsort->next再重复上述步骤即可。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if(head==NULL) return head;
ListNode* dummy=new ListNode(0,head);
ListNode* cur=head->next;
ListNode* lastsorted=head;
while(cur!=NULL){
if(lastsorted->val<=cur->val){
lastsorted=lastsorted->next;
}
else{
ListNode* pre=dummy;
while(pre->next->val<=cur->val){
pre=pre->next;
}
lastsorted->next=cur->next;
cur->next=pre->next;
pre->next=cur;
}
cur=lastsorted->next;
}
return dummy->next;
}
};