链表排序

题目需求

/**
* 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
* <p>
* 示例 1:
* <p>
* 输入: 4->2->1->3
* 输出: 1->2->3->4
* 示例 2:
* <p>
* 输入: -1->5->3->4->0
* 输出: -1->0->3->4->5
*/

解题思路

快排

public ListNode sortList(ListNode head) {
     if (head == null || head.next == null) {
         return head;
     }
     ListNode end = head;
     while (end.next != null) {
         end = end.next;
     }
     qSort(head, end);
     return head;
 }
 private void qSort(ListNode head, ListNode end) {
     if (head == null || head == end || end == null) {
         return;
     }
     ListNode p = partition(head, end);
     qSort(head, p);
     ListNode pNext = p.next == null ? p : p.next;
     qSort(pNext, end);
 }

 private ListNode partition(ListNode head, ListNode end) {
     if (head == null || end == head) {
         return head;
     }

     ListNode pivot = end;
     int pValue = pivot.val;
     ListNode i = head, j = head;
     ListNode retNode = head;

     for (; j != null && j != end; j = j.next) {

         if (j.val < pValue) {
             int t = i.val;
             i.val = j.val;
             j.val = t;
             retNode = i;
             i = i.next;
         }
     }
     end.val = i.val;
     i.val = pValue;
     return retNode;
 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. 第一个题目 合并两个有序链表 认真阅读题目 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定...
    小王同学加油阅读 441评论 0 1
  • 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。 示例 1: 输入: 4->2->1->...
    1f872d1e3817阅读 230评论 0 0
  • 描述 在 O(nlogn) 时间复杂度和常数级的空间复杂度下给链表排序 样例 给出 1->3->2->null,给...
    6默默Welsh阅读 1,338评论 0 0
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,438评论 0 2
  • 躺在这里已经很久了 忘了几时开始,也不知何时结束 只是呈大字,躺在这荒郊 身下有个小坑,不深,但硌得腰疼 蛇会定期...
    April石阅读 288评论 12 42