1. 程式人生 > 其它 >LeetCode148排序連結串列-----歸併排序

LeetCode148排序連結串列-----歸併排序

題目表述

給你連結串列的頭結點 head ,請將其按 升序 排列並返回 排序後的連結串列 。
示例:

歸併排序

歸併排序本質,遞迴加合併兩個有序連結串列。

  • 利用快慢指標,找到連結串列中點,以中點為邊界,將連結串列拆分成為兩個子連結串列。

  • 對兩個子連結串列分別進行排序。

  • 將兩個排序後的子連結串列合併,得到完整的排序後的連結串列。可以使用 合併兩個有序連結串列的做法,將兩個有序的子連結串列進行合併。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        if(head == null){
            return null;
        }
        if(head.next == null){
            return head;
        }
        ListNode dummy = new ListNode(-1,head);
        ListNode slow = new ListNode(-1,head);
        ListNode fast = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode tmp = slow.next;
        slow.next = null;
        ListNode left = sortList(head);
        ListNode right = sortList(tmp);
        ListNode tmphead = new ListNode(0);
        ListNode path = tmphead;
        while(left != null && right != null){
            if(left.val < right.val){
                path.next = left;
                left = left.next;
            }else{
                path.next = right;
                right  = right.next;
            }
            path = path.next;
        }
        path.next = left == null? right:left;
        return tmphead.next;

    }


}