Sort List 链表排序

Sort a linked list in O(n log n) time using constant space complexity.

----------------------------------------------------------------------------------------------------------------------------------------

这里,依旧利用分治的思想,更具体点就是归并排序的算法。

假设list 的前一半已经排好序的,后一半也已经排好序了,那么将这2 Merge起来如果不知道怎么Merge,可以看我前面博文)

那么具体list的前一半怎么排序呢?也是拆分成2部分。

现在我们需要解决的问题,如何将得到list的中间节点呢?不像数组有index,可以直接得到。

这里,又是two pointer,双指针了,一个slow指针一次走1步,一个fast指针一次走2步。

那么当fast碰到null的时候,slow就在中间部位了。

1. 我们先对后面的 slow.next 进行递归排序,得到L2。

2. 接着,我们将slow.next = null, 即从中间将原链表断开。

3.对前面部分进行递归排序,得到L1

4. 最将L1和L2 merge。


时间复杂度:O( n log n )

空间复杂度:O ( 1 )


运行时间:


代码:

    public ListNode sortList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode fast = head.next, slow = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode l2 = sortList(slow.next);
        slow.next = null;
        ListNode l1 = sortList(head);
        return mergeTwoLists(l1, l2);
    }
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode fakeNode = new ListNode(-1), cur = fakeNode, curl1 = l1, curl2 = l2;
        while (curl1 != null && curl2 != null) {
            if (curl1.val < curl2.val) {
                cur.next = curl1;
                curl1 = curl1.next;
            } else {
                cur.next = curl2;
                curl2 = curl2.next;
            }
            cur = cur.next;
        }
        cur.next = curl1 != null ? curl1 : curl2;
        return fakeNode.next;
    }


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值