Sort List Problem
For God’s sake, don’t try sorting a linked list during the interview
So it might be better to actually copy the values into an array and sort them there.
Tip:
Since a node may be inserted before head, we can create a new_head that points to head.
Insertion Sort List:
My version:
ListNode* insertionSortList(ListNode* head) {
if(head == NULL) return head;
ListNode* new_head = new ListNode(numeric_limits<int>::min());
new_head->next = head;
ListNode* right = head->next;
head->next = NULL;
while(right){
ListNode* rnext = right->next;
right->next = NULL;
ListNode* p = new_head;
while(p){
if(p->next != NULL && p->next->val > right->val && p->val <= right->val){
right->next = p->next;
p->next = right;
break;
}
if(p->next == NULL){
p->next = right;
break;
}
p = p->next;
}
right = rnext;
}
head = new_head->next;
delete(new_head);
return head;
}
Better version:
ListNode* insertionSortList(ListNode* head) {
ListNode* new_head = new ListNode(0);
new_head -> next = head;
ListNode* pre = new_head;
ListNode* cur = head;
while (cur) {
if (cur -> next && cur -> next -> val < cur -> val) {
while (pre -> next && pre -> next -> val < cur -> next -> val)
pre = pre -> next;
/* Insert cur -> next after pre.*/
ListNode* temp = pre -> next;
pre -> next = cur -> next;
cur -> next = cur -> next -> next;
pre -> next -> next = temp;
/* Move pre back to new_head. */
pre = new_head;
}
else cur = cur -> next;
}
ListNode* res = new_head -> next;
delete new_head;
return res;
}