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;

    }


}
posted @ 2022-04-17 19:19  YoungerWb  阅读(17)  评论(0编辑  收藏  举报