/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode sortList(ListNode head) {
return head == null ? head : merge(head);
}
//划分
public ListNode merge(ListNode head){
if (head.next == null) { //递归退出条件:即链表被划分后只剩一个结点
return head;
}
ListNode fast = head, slow = head, pre = head; //这里使用快慢指针 进行链表划分
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null; //划分结果是,fast为原链表尾.next, slow为划分后链表右半部分表头,pre为左半部分表尾结点,所以pre.next要为null
ListNode l = merge(head); //左半部分递归划分
ListNode r = merge(slow); //右半部分递归划分
return mergeList(l,r); //合并链表
}
//合并 此处f是合并两个有序链表。
public ListNode mergeList(ListNode h1,ListNode h2){
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while (h1 != null && h2 != null) {
if (h1.val < h2.val) {
head.next = h1;
head = head.next;
h1 = h1.next;
}else {
head.next = h2;
head = head.next;
h2 = h2.next;
}
}
if (h1 == null) {
head.next = h2;
}else {
head.next = h1;
}
return dummy.next;
}
}