题目:
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:
//插入排序 对链表排序
ListNode *insertionSortList(ListNode *head) {
if(head == NULL)
{
return NULL;
}
if(head->next == NULL)
return head;
//sort表示的是有序序列的开始
ListNode* sort =head;
while(sort->next)
{
sort = sort->next;
}
//sort的初始值设为是最后的结点
while(1)
{
ListNode* cur = head;
ListNode* prev = cur;
//prev表示的是有序序列的前一个 结点 ,也就是当前要 插入的数
while(prev->next != sort)
{
prev = prev->next;
}
ListNode* tmp = prev;
//记录要插入的数;
int data = tmp->val;
//要插入的数data大于 sort 就向前走
while(sort&&data > sort->val)
{
tmp->val = sort->val;
sort = sort->next;
tmp = tmp->next;
}
tmp->val = data;
sort = prev;
//当有序的序列到 头结点的时候 结束
if(sort == head)
return head;
}
}
};