排序链表Sort List-经典快速排序实现链表排序

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

示例 1:

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

示例 2:

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

    基于快速排序思想去实现,而且链表的排序,在code里,我们只是调换了值,所以没有额外的链表节点空间开销。

 

public class SortList {
    public class ListNode {
        int val;
        ListNode next;

        ListNode(int a) {
            val = a;
        }
    }
    //首先
    public ListNode sortList(ListNode head) {
        quickSort(head, null);//执行快速排序,交换节点内部的数值
        return head;//因为只是交换数值,返回头结点
    }

    //递归
    public void quickSort(ListNode head, ListNode end) {
        if (head != end) {//快速排序,双指针不能相等
            ListNode nextBaseNode = sortByBasenode(head);//取得下一个基准node
            quickSort(head, nextBaseNode);//左边的递归
            quickSort(nextBaseNode.next, end); //右边递归
        }
    }
    //基于某个
    public ListNode sortByBasenode(ListNode base) {
        ListNode slow = base;//慢指针
        ListNode fast = base.next;//快指针

        while (fast != null) {
            //这个循环处理,基准节点base没有任何变化,知识先将比基准小的都放到slow指针的左侧,比如:
            if (fast.val < base.val) {//发现有节点的值小于基准值
                slow = slow.next;//左指针右移
                //交换左右指针节点的值
                int tmp = slow.val;
                slow.val = fast.val;
                fast.val = tmp;
            }
            //不管right值怎样,都需要向后移动
            fast = fast.next;
        }
        //最后将base的值放入slow节点,并交换值
        int tmp = base.val;
        base.val = slow.val;
        slow.val = tmp;
        return slow;
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值