排序:1.在O(n log n)的时间内使用常数级空间复杂度对链表进行排序,归并排序

时间复杂度(平均)

时间复杂度(最坏)

时间复杂度(最好)

空间复杂度

稳定性

复杂性

直接插入排序

O(n2)O(n2)

O(n2)O(n2)

O(n)O(n)

O(1)O(1)

稳定

简单

希尔排序

O(nlog2n)O(nlog2n)

O(n2)O(n2)

O(n)O(n)

O(1)O(1)

不稳定

较复杂

直接选择排序

O(n2)O(n2)

O(n2)O(n2)

O(n2)O(n2)

O(1)O(1)

不稳定

简单

堆排序

O(nlog2n)O(nlog2n)

O(nlog2n)O(nlog2n)

O(nlog2n)O(nlog2n)

O(1)O(1)

不稳定

较复杂

冒泡排序

O(n2)O(n2)

O(n2)O(n2)

O(n)O(n)

O(1)O(1)

稳定

简单

快速排序

O(nlog2n)O(nlog2n)

O(n2)O(n2)

O(nlog2n)O(nlog2n)

O(nlog2n)O(nlog2n)

不稳定

较复杂

归并排序

O(nlog2n)O(nlog2n)

O(nlog2n)O(nlog2n)

O(nlog2n)O(nlog2n)

O(n)O(n)

稳定

较复杂

基数排序

O(d(n+r))O(d(n+r))

O(d(n+r))O(d(n+r))

O(d(n+r))O(d(n+r))

O(n+r)O(n+r)

稳定

较复杂

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode mid = getmid(head);//取中点,前半段
        ListNode midnext = mid.next;//后半段
        mid.next = null;
        return merge(sortList(head), sortList(midnext));//递归前半段,后半段
    }


    //取中点
    public ListNode getmid(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        //快慢指针
        ListNode slow = head;
        ListNode quick = head;
        //快指针结束,慢指针到达中点
        while (quick.next != null && quick.next.next!= null) {
            slow = slow.next;
            quick = quick.next.next;
        }
        return slow;
    }

    //nlogn归并排序
    public ListNode merge(ListNode a, ListNode b) {
        //建立一个新的链表l
        ListNode l = new ListNode(0);
        //aa,bb,ll为工作指针
        ListNode aa = a;
        ListNode bb = b;
        ListNode ll = l;
        while (aa != null && bb != null) {
            if (aa.val < bb.val) {
                ll.next = aa;
                aa = aa.next;

            } else {
                ll.next = bb;
                bb = bb.next;
            }
            ll = ll.next;//提到外面
        }
            //其中任意一条走完,直接将剩余的加在后面即可,aa,bb不需要移动
            if (aa != null) {
                ll.next = aa;
            }
            if (bb != null) {
                ll.next = bb;

            }
            return l.next;//返回l.next
        }
}














 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值