Sort-----148. Sort List

来源:互联网 发布:苏州app软件开发 编辑:程序博客网 时间:2024/06/06 13:01

原题目

题目就是把一个链表在nlgn的时间内使用常数空间排序。

第一次尝试,明知道不会过,但是就是想写写链表的选择排序

 public ListNode sortList(ListNode head) {        ListNode p = head;        ListNode q = head;        while (p != null) {            q = p.next;            while (q != null) {                int temp = p.val;                if (q.val < temp) {                    p.val = q.val;                    q.val = temp;                }                q = q.next;            }            p = p.next;        }        return head;    }

第二次使用的类库Collections

虽然通过,但是实在是,。,没意思。

    public ListNode sortList(ListNode head) {        ListNode p = head;        List<Integer> result = new ArrayList<>();        visit(p, result);        Collections.sort(result);        for (int i = 0; i < result.size(); i++) {            p.val = result.get(i);            p = p.next;        }        return head;    }    public void visit(ListNode head, List<Integer> result) {        ListNode p = head;        while (p != null) {            result.add(p.val);            p = p.next;        }    }

第三种终极做法就是归并排序

链表的归并排序

  public ListNode sortList(ListNode head) {        if (head == null || head.next == null) {            return head;        }        ListNode mid = getMidListNode(head);        ListNode list2 = mid.next;        mid.next = null;        return mergeList(sortList(head), sortList(list2));    }    private ListNode mergeList(ListNode list1, ListNode list2) {        ListNode dummyHead = new ListNode(0);        ListNode curr = dummyHead;        while (list1 != null && list2 != null) {            if (list1.val < list2.val) {                curr.next = list1;                list1 = list1.next;            } else {                curr.next = list2;                list2 = list2.next;            }            curr = curr.next;        }        curr.next = list1 != null ? list1 : list2;        return dummyHead.next;    }    private ListNode getMidListNode(ListNode head) {        ListNode slow = head, fast = head;        while (fast.next != null && fast.next.next != null) {            slow = slow.next;            fast = fast.next.next;        }        return slow;    }
原创粉丝点击