zoukankan      html  css  js  c++  java
  • [Leetcode] 第148题 排序链表

    一、题目描述

    在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。

    示例 1:

    输入: 4->2->1->3
    输出: 1->2->3->4
    

    示例 2:

    输入: -1->5->3->4->0
    输出: -1->0->3->4->5

    二、题目分析

    1)采用快排的思想,以第一个节点为基准,分成左右两部分分别排序

    2)因为是链表,所以用一个整数cnt来标记要进行排序的链表节点的个数,不能超过这个数目

    三、代码实现

     1 class Solution {
     2 public:
     3     ListNode* sortList(ListNode* head) {
     4         int cnt = 0;
     5         ListNode *p = head;
     6         while (p) {
     7             ++cnt;
     8             p = p->next;
     9         }
    10         return quickSort(head, cnt);
    11     }
    12 private:
    13     ListNode* quickSort(ListNode *head, int cnt) {
    14         //cnt记录要进行排序的节点个数
    15         if (!head || !head->next || cnt == 0 || cnt == 1)
    16             return head;
    17         int left_cnt = 0, right_cnt = 0, base = head->val;
    18         ListNode* cur = head->next, *pre = head, *p = head;
    19         for (int i = 1; i < cnt; ++i) {
    20             if (cur&&cur->val < base) {
    21                 ++left_cnt;
    22                 pre->next = cur->next;
    23                 cur->next = head;
    24                 head = cur;
    25                 cur = pre->next;
    26             }
    27             else if (cur&&cur->val >= base) {
    28                 ++right_cnt;
    29                 pre = cur;
    30                 cur = cur->next;
    31             }
    32         }
    33         ListNode* left_node = quickSort(head, left_cnt);
    34         ListNode* right_node = quickSort(p->next, right_cnt);
    35         p->next = right_node;
    36         head = left_node;
    37         return head;
    38     }
    39 };
  • 相关阅读:
    20181205关于android动态权限管理的总结与思考。
    pixel2坑
    Picasso遇到的坑
    集成主流框架搭建项目
    outdoor-youwin
    利用scatter()绘制颜色映射的二次方曲线
    一个有意义的Day类
    [Hadoop] Yarn & k8s
    hadoop 操作
    yarn 图形化监控
  • 原文地址:https://www.cnblogs.com/zhizhiyu/p/10244818.html
Copyright © 2011-2022 走看看