[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 };

 

posted @ 2019-01-09 15:46  zhizhiyu  阅读(206)  评论(0编辑  收藏  举报