您的位置:首页 > 其它

LeetCode(2):insertion-sort-list

2018-03-02 09:34 302 查看
题目描述
       Sort a linked list using insertion sort.

思考

      与《LeetCode(1):sort-list》一样,本题仍然采用链表作为存储结构,不过本题要求使用插入排序。关于插入排序的介绍可以参考十大经典排序算法数据结构常见的八大排序算法八大经典排序算法
      首先通过数组来看插入算法。
      插入算法,顾名思义,将元素一个一个插入(已排序子序列)进行排序。比如说,我们有一个序列(6, 2, 3, 12),先将(6,)当成一个已排序序列;然后拿出第二个元素2,将其插入以排序序列,这里我们可以从已排序序列的末端往前进行遍历插入,值得注意的是,通常我们会设置一个哨兵,用于解决数组越界问题,这一步之后我们将得到(2, 6);接着取出元素3,先与6比较,发现3较小,继续往前与2比较,发现3>2,所以进行插入,得到(2, 3, 6);最后,拿出12往前插入,得到(2, 3, 6, 12),即为最终的有序序列。
      下面介绍一下无哨兵的插入排序和有哨兵的插入排序。
1.无哨兵void insertSort(int arr[], const int length){
for(int i = 1; i < length; i++){
if(arr[i] < arr[i-1]){
int temp = arr[i];
int j;
for(j = i - 1; j>=0 && temp < arr[j]; j--){
arr[j + 1] = arr[j];
}
arr[j] = temp;
}
}
}2.有哨兵
      对于有哨兵的插入排序而言,我们有多种实现方法。一种是另外开辟一块大小为len(arr)+1的空间temp,并使之符合temp[i+1]=arr[i],而temp[0]用于存放哨兵,哨兵的值设置为待插入元素的值。第二种方法是不用申明一个数组,每次将待插入元素x赋值给arr[0],当然在这之前我们已经将arr[0]保存下来了,记为y,然后将x依次对比并进行插入,最后把y放回0或1位置,如果x比y要大,那么y放于arr[0],否则放到arr[1]。下面我们给出第二种方法的代码:
void insertSort(int arr[], const int length){
for(int i = 1; i < length; i++){
int y = arr[0];
arr[0] = arr[i];
for(int j = i; arr[0] < arr[j-1]; j--){
a[j] = a[j-1];
}
arr [j] = arr[0];
if(y < arr[0]){
arr[j] = arr[0];
arr[0] = y;
}
else{
arr[j] = y;
}
}
}      下面看一下本题,本题中使用链表作为存储结构,考虑到链表的特殊性(比如我们很难从已排序链表后面往前比
4000
较插入,因为单向链表并不能很方便地倒序遍历),我们从前往后遍历插入,用NULL作为遍历结束判断,无需哨兵。
      下面使用插入排序解题:class Solution {
public:
ListNode* insertionSortList(ListNode* head) {
if(head == NULL || head->next == NULL) return head;
//惯用手法
ListNode sortedList(0);
ListNode* cur = head;
while(cur){
//预先存下cur->next
ListNode* next = cur->next;
//node在已排序数组中遍历
//从前向后遍历排序数组的每一个节点,和当前未排序数组中的节点(cur)做比较
ListNode* node = &sortedList;
while(node->next != nullptr && node->next->val < cur->val)
{
node = node->next;
}
cur->next = node->next;
node->next = cur;
cur = next;
}
//因为sortedList作为本链表头节点,直接指向第一个节点,而LeetCode中head直接指向第一个节点(没有特别说明的话,并没有头节点H),所以返回的时候也要去掉头节点
return sortedList.next;
}
};      在使用链表排序时,常常定义一个新的链表头,用于重新组织链表,最后记得返回sortedList.next,而不是sortedList。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: