Sort a linked list using insertion sort.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
#define MIN_VALUE -10000
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if (!head)
return NULL;
ListNode newHead(MIN_VALUE);
ListNode *pNewHead = &newHead;
ListNode *pNewNode = pNewHead;
ListNode oldHead(MIN_VALUE);
ListNode *pPreHeadNode = &oldHead;
pPreHeadNode->next = head;
while (true)
{
ListNode *pCurNode = pPreHeadNode->next;
ListNode *pPreNode = pPreHeadNode;
ListNode *pMinCurNode = pCurNode;
ListNode *pMinPreNode = pPreNode;
while (pCurNode)
{
if (pCurNode->val < pMinCurNode->val)
{
pMinCurNode = pCurNode;
pMinPreNode = pPreNode;
}
pCurNode = pCurNode->next;
pPreNode = pPreNode->next;
}
if (pMinCurNode)
{
pMinPreNode->next = pMinCurNode->next;
pNewNode->next = pMinCurNode;
pNewNode = pNewNode->next;
}
else
{
break;
}
}
return pNewHead->next;
}
};