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) {}
* };
*/
class Solution {
public:
/**
* insert 把i插到j后面,pre_i为i的前一个
* */
void insert(ListNode* pre_i, ListNode* j) {
ListNode* i = pre_i->next;
pre_i->next = i->next;
i->next = j->next;
j->next = i;
}
ListNode* insertionSortList(ListNode* head) {
if(head==NULL || head->next==NULL) return head;
ListNode* tmp_head = new ListNode(0);
tmp_head->next = head;
for(ListNode* i=head, *pre_i=tmp_head; i != NULL; pre_i = i, i = i->next) {
ListNode* j = tmp_head; //从tmp_head开始的原因是:后插简单于前插
while(j->next != i) {
if(i->val < j->next->val) { //把i插到j后面,pre_i为i的前一个
insert(pre_i, j);
i = pre_i;
}
else {
j = j->next;
}
}
}
head = tmp_head->next;
delete tmp_head;
return head;
}
};