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;
}
}