leetcode 148 排序链表

题目链接:https://leetcode-cn.com/problems/sort-list/

就是对一个链表进行排序。。

我采取得快排的思路,提交超过5%。。。看list标准库是用归并排序实现的,过几天改下的,现在先把链表快排的思路放上:

  1. 选择target(即基础点,左边的元素都小于target,右边的都大于target)
  2. 快指针从前往后,找到一个小于target,然后与low指针对换val(链表节点顺序不变,只改变其中的val)
  3. 递归处理左边和右边(以low为界)
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     ListNode* sortList(ListNode* head) {
14         if(head==nullptr) return head;
15         sort(head, nullptr);
16         return head;
17     }
18 
19     void sort(ListNode *begin, ListNode *end){
20         if(begin == end) return;
21         ListNode *fast = begin->next, *low = begin;
22         int target = begin->val;
23         while(fast != end){
24             if(fast->val < target){
25                 low = low->next;
26                 swap(fast->val, low->val);
27             }
28             fast = fast->next;
29         }
30         swap(begin->val, low->val);
31         sort(begin, low);
32         sort(low->next, end);
33     }
34 };

 

posted @ 2021-03-07 15:15  zju_cxl  阅读(28)  评论(0编辑  收藏  举报