Sort List题解

题目来源:https://leetcode.com/problems/sort-list/description/


Description

Sort a linked list in O(n log n) time using constant space complexity.

Solution

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/ class Solution {
public:
int partition(vector<int>& arr, int start, int end) {
int pivot = arr[start];
int low = start, high = end;
while (low < high) {
while (arr[low] <= pivot && low < high)
++low;
while (arr[high] > pivot && low < high)
--high;
swap(arr[low], arr[high]);
}
if (arr[low] > pivot)
--low;
arr[start] = arr[low];
arr[low] = pivot;
return low;
} void quickSort(vector<int>& arr, int start, int end) {
if (start >= end)
return;
int pivotIndex = partition(arr, start, end);
quickSort(arr, start, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, end);
} ListNode* sortList(ListNode* head) {
if (head == NULL || head -> next == NULL) {
return head;
} ListNode* temp = head;
vector<int> arr; while (temp != NULL) {
arr.push_back(temp -> val);
temp = temp -> next;
} quickSort(arr, 0, arr.size() - 1); temp = head;
int i = 0;
while (temp != NULL) {
temp -> val = arr[i++];
temp = temp -> next;
} return head;
}
};

解题描述

这道题考察的是链表排序。我首先想到的是把链表里面的元素拷贝到一个vector里面然后再快排,这就跟平时对数组快排的操作一样了,然后写起来也比较好写。但是AC之后觉得,2次拷贝元素的时间会不会有点多?而且还带来了额外的空间开销。于是自己还是写多了一个针对链表的快排:

class Solution {
public:
void swap(int& a, int& b) {
int t = a;
a = b;
b = t;
} ListNode* partition(ListNode* low, ListNode* high) {
int key = low -> val;
ListNode *locNode = low; // the location node the that key will locate at last
for (ListNode* tempNode = low -> next; tempNode != high; tempNode = tempNode -> next) {
if (tempNode -> val < key) {
locNode = locNode -> next;
swap(locNode -> val, tempNode -> val);
}
}
swap(low -> val, locNode -> val);
return locNode;
} void quickSort(ListNode* head, ListNode* tail) {
ListNode* posNode;
if (head != tail && head -> next != tail) { // left close, right open interval
posNode = partition(head, tail);
quickSort(head, posNode);
quickSort(posNode -> next, tail);
}
return;
} ListNode* sortList(ListNode* head) {
quickSort(head, NULL);
return head;
}
};

但是实际跑出来结果却是(后提交的是用链表快排):



可能因为vector底层是用数组实现的,访问速度会比链表快一些,所以就算加上了拷贝元素的时间,总体的时间复杂度还是要低于直接对链表进行快排。

更优解法

2018.2.3更新

对链表来说,选择归并排序才是更明智的选择

  • 链表无法像数组一样快速随机访问元素,要求排序算法元素访问次数较少且稳定
  • 使用归并排序处理链表不需要像数组一样使用额外的内存,合并链表的时候只需要进行指针连接即可

下面给出链表递归归并排序的实现:

class Solution {
private:
ListNode* merge(ListNode* head1, ListNode* head2) {
ListNode tempHead(0);
ListNode *curNode = &tempHead;
while (head1 && head2) {
if (head1 -> val <= head2 -> val) {
curNode -> next = head1;
head1 = head1 -> next;
} else {
curNode -> next = head2;
head2 = head2 -> next;
}
curNode = curNode -> next;
}
while (head1) {
curNode -> next = head1;
head1 = head1 -> next;
curNode = curNode -> next;
}
while (head2) {
curNode -> next = head2;
head2 = head2 -> next;
curNode = curNode -> next;
}
return tempHead.next;
}
public:
ListNode* sortList(ListNode* head) {
if (!head)
return NULL;
if (head -> next == NULL)
return head;
if (head -> next -> next == NULL) {
if (head -> val <= head -> next -> val) {
return head;
} else {
ListNode *newHead = head -> next;
newHead -> next = head;
head -> next = NULL;
return newHead;
}
}
ListNode *mid = head, *tail = head;
while (tail && tail -> next) {
mid = mid -> next;
tail = tail -> next -> next;
}
ListNode* head2 = sortList(mid -> next);
mid -> next = NULL;
head = sortList(head);
return merge(head, head2);
}
};

[Leetcode Week2]Sort List的更多相关文章

  1. [Leetcode Week2]Sort Colors

    Sort Colors题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/sort-colors/description/ Description Give ...

  2. C#版 - LeetCode 148. Sort List 解题报告(归并排序小结)

    leetcode 148. Sort List 提交网址: https://leetcode.com/problems/sort-list/  Total Accepted: 68702 Total ...

  3. 待字闺中之快排单向链表;leetcode之Sort List

    题目来源.待字闺中.原创@陈利人 .欢迎大家继续关注微信公众账号"待字闺中" 分析:思路和数据的高速排序一样,都须要找到一个pivot元素.或者节点. 然后将数组或者单向链表划分为 ...

  4. LeetCode——Insertion Sort List

    LeetCode--Insertion Sort List Question Sort a linked list using insertion sort. Solution 我的解法,假设第一个节 ...

  5. [LeetCode] Wiggle Sort II 摆动排序

    Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3]... ...

  6. [LeetCode] Wiggle Sort 摆动排序

    Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...

  7. [LeetCode] Insertion Sort List 链表插入排序

    Sort a linked list using insertion sort. 链表的插入排序实现原理很简单,就是一个元素一个元素的从原链表中取出来,然后按顺序插入到新链表中,时间复杂度为O(n2) ...

  8. 【Leetcode】Sort List JAVA实现

    Sort a linked list in O(n log n) time using constant space complexity. 1.分析 该题主要考查了链接上的合并排序算法. 2.正确代 ...

  9. [LeetCode] 148. Sort List 解题思路

    Sort a linked list in O(n log n) time using constant space complexity. 问题:对一个单列表排序,要求时间复杂度为 O(n*logn ...

随机推荐

  1. Qt 建立带有子项目的工程

    刚需,软件需要用到多个子项目 第一步 打开Qt新建子项目工程 如图 在此时鼠标右键,选着新建子项目如图 就是正常的新建项目的步骤,直接上图 完工,可以愉快的撸代码了

  2. GraphSAGE 代码解析(二) - layers.py

    原创文章-转载请注明出处哦.其他部分内容参见以下链接- GraphSAGE 代码解析(一) - unsupervised_train.py GraphSAGE 代码解析(三) - aggregator ...

  3. BZOJ 3925 ZJOI2015 地震后的幻想乡 状压dp+期望

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3925 题意概述: 给出一张N点M边的最小生成树,其中每条边的长度为[0,1]的实数,求最小 ...

  4. 配置Android应用开发环境

    详解JRE.JDK.SDK.ADT请点击辨析ADK&JVM&JRE&JDK&ADT 一.安装JDK 开发 Android应用程序的时候,仅有Java运行环境(Java ...

  5. [USACO07DEC]美食的食草动物Gourmet Grazers

    ---题面--- 题解: 首先观察题面,直觉上对于一头奶牛,肯定要给它配pi和qi符合条件的草中两者尽量低的草,以节省下好草给高要求的牛. 实际上这是对的,但观察到两者尽量低这个条件并不明确,无法用于 ...

  6. Mybatis缓存机制及mybatis的各个组成部分

    Mybatis 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 ...

  7. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  8. HDU 5666 快速乘

    Segment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  9. angular js的Inline Array Annotation的理解

    inline Array annotation的形式是: someModule.controller('MyController', ['$scope', 'greeter', function($s ...

  10. idea初学建立maven项目报错

    原理,是因为你没把新创建好的maven项目给设置成一个可被tomcat部署的web项目 参考此博文,讲的非常详细: 归根到底是因为web项目的部署问题: 解决方案:在创建的到时候,idea下部会提示是 ...