题目
Sort a linked list using insertion sort.
分析
插入排序,依次遍历。
复杂度
O(n^2)
注意
1.Leetcode中所有的单链表题目应该都是无头结点的。
2. 如果序列中有重复的值,应该选择插入到前面,而不是从后面插入,即前插发,减少不必要的移动操作。
CODE
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
typedef ListNode * pListNode;
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
// no. of elems less than two
if (head == NULL || head->next == NULL) {
return head;
}
// others
ListNode *p = head->next;
// new list
head->next = NULL;
while (p != NULL) {
ListNode *q = p->next;
//head = insertToHead(head, p);
insertToHead(head, p);
p = q;
}
return head; // 第一次遗漏造成返回结果为空
}
void insertToHead(pListNode &head, pListNode p) {
if (p->val <= head->val) {
p->next = head;
head = p;
return ;
}
ListNode *pre = head, *cur = pre->next;
while (cur != NULL) {
if (cur->val < p->val) {
// move
pre = cur;
cur = cur->next;
} else {
pre->next = p;
p->next = cur;
return ;
}
}
// cur == NULL
pre->next = p;
p->next = NULL;
return ;
}
};