LeetCode 148. Sort List--O(nlogn)时间复杂度和常数空间复杂度给链表排序

来源:互联网 发布:岛精程序员制版招聘 编辑:程序博客网 时间:2024/06/05 14:12

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

package com.main;class ListNode {    int val;    ListNode next;    ListNode(int x) {        val = x;    }}public class Main {    public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }        //平分结点,分成两个分支        ListNode cur = null, slow = head, fast = head;        while (fast != null && fast.next != null) {//如果是奇数个结点,多出来的一个结点放在了后面的部分            cur = slow;            slow = slow.next;            fast = fast.next.next;        }        cur.next = null;        //每个分支都要排序,然后按序合并        ListNode l1 = sortList(head);        ListNode l2 = sortList(slow);        //按序合并,子分支和大分支都在这里合并        return merge(l1, l2);    }//sortList    public ListNode merge(ListNode l1, ListNode l2) {        ListNode res = new ListNode(0), p = res;        while (l1 != null && l2 != null) {            if (l1.val < l2.val) {                res.val = l1.val;                p.next = l1;//这一句别忘了                l1 = l1.next;            } else {                res.val = l2.val;                p.next = l2;                l2 = l2.next;            }            p = p.next;        }//while        if (l1 != null) {            p.next = l1;        }        if (l2 != null) {//            p.next = l2.next;不能是p.next = l2.next            p.next = l2;        }        return res.next;// ListNode res = new ListNode(0)因为第一个结点是0,所以这里是 res.next,而不是res    }//merge    public static void main(String[] args) {        ListNode A = new ListNode(6);        A.next = new ListNode(2);        A.next.next = new ListNode(4);        A.next.next.next = new ListNode(3);        A.next.next.next.next = new ListNode(5);        Main main = new Main();        ListNode C = main.sortList(A);        System.out.println(C);    }}

以下为递归执行流程,分别是2个结点和4个结点的情况

15 / 15 test cases passed.
Status: Accepted
Runtime: 8 ms
T(n) = O(nlogn) 




阅读全文
0 0
原创粉丝点击