Sort a linked list using insertion sort.
仍然是一个非常简洁的题目,让我们用插入排序给链表排序;这里说到插入排序,可以来回顾一下, 最基本的入门排序算法,就是插入排序了;时间复杂度为n^2,最基本的插入排序是基于数组实现的,下面给出基于数组实现的插入排序,来体会一个插入排序的思想;
以下仅为数组实现,不是解题代码,没兴趣可以跳过。
void insertionsort (int a[], int N)
{
for (int i = 1; i < N; i++){
int tmp = a[i];
for (int j = i; j >= 0 && a[j] < a[j - 1]; j--) //这里是升序排列,所以是a[j] < a[j - 1]
a[j] = a[j - 1];
a[j] = tmp;
}
}二、数组需要挨个替换,我上面的写法在寻找合适位置的同时就直接替换了,所以感觉没那么明显,而链表则是在需找到合适位置之后,把待排序节点拿出插入其中,体现了链表的动态性。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *insertionSortList(ListNode *head) {
if (head == NULL || head->next == NULL)
return head;
ListNode *tmp = NULL;
ListNode *pre_tmp = NULL;
ListNode *dummy = new ListNode(0);
ListNode *pos = head->next; //这里用pos指向第一待插入排序数据
ListNode *pre_pos = head;
dummy->next = head;
while(pos != NULL){
tmp = dummy->next; //这里一开始写成了 tmp = head 一直错,太不细心了!在引入哑节点之后,
//这里就不能等于head,只有这样才可以从第一个开始扫描开始扫描。
pre_tmp = dummy;
while(tmp->val < pos->val && tmp != pos){ //第二个条件在数组插入排序时事不用判断的,这里需要注意!
pre_tmp = tmp;
tmp = tmp->next;
}
if (tmp != pos)
{
pre_pos->next = pos->next;
pre_tmp->next = pos;
pos->next = tmp;
pos = pre_pos;
}
pre_pos = pos;
pos = pos->next;
}
return dummy->next;
}
};LeetCode :: Insertion Sort List [详细分析],布布扣,bubuko.com
LeetCode :: Insertion Sort List [详细分析]
原文:http://blog.csdn.net/u013195320/article/details/33432615