LeetCode148排序連結串列-----歸併排序
阿新 • • 發佈:2022-04-17
題目表述
給你連結串列的頭結點 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; } }