仅用20行代码搞定链表快速排序,面试官直呼内行(Java实现)

对链表进行快速排序,之前有写过文章,详情可参考java实现单链表的快速排序,不过代码实现有些臃肿,因此有了今天的加强版(利用哑铃节点的技巧,减少了许多判空的代码)。
对应快速排序,相信非常熟悉了,直接来看代码实现

public ListNode quickSort(ListNode head, ListNode tail) {
        ListNode p;
        if (head == null || head == tail || (p = head.next) == null || p == tail) {
            return head;
        }
        ListNode d1 = new ListNode(-1), d2 = new ListNode(-1), p1 = d1, p2 = d2;
        do {
            if (p.val < head.val) {
                p1.next = p;
                p1 = p1.next;
            } else {
                p2.next = p;
                p2 = p2.next;
            }
        } while ((p = p.next) != tail);
        p1.next = head;p2.next = tail;
        ListNode left = quickSort(d1.next, head);
        head.next = quickSort(d2.next, tail);
        return left == null ? head : left;
    }

不多不少,刚好20行,找力扣上的一道链表排序题验证准确性,发现可以AC的

在这里插入图片描述
现在来讲讲代码的主要逻辑,快速排序的思想就不说了,详情可参考这篇文章快速排序
首先说明一下该方法的语义:对 [head,tail) 进行快速排序并返回新的头节点,注意方法的第二个参数tail,它的作用为用作边界挡板,因此方法首次调用时的传递为quickSort(head, null)
代码核心逻辑为引入2个哑铃节点d1(存较小的),d2(存较大的),每次都以头节点的值作为基准volt,比volt小的连接在d1上,比volt大的连接在d2上,举个例子,对以下链表排序,
3->6->5->1->2
第一趟排序结果为1->2->3->6->5
此时head指向3也就是volt,那么接下来就是要对[1,3)、[6,5]递归进行快速排序,因此函数的base会对head与tail做判断,如果碰到挡板直接返回了,对于[1,3),3也就是head(也是基准中间值)成为新的挡板,然后再对右边排序,最后返回新的头节点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b17a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值