掌握此归并排序list,对于快排,之后熟悉。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
//if (head == null) {
if (head == null || head.next == null) {
return head;
}
ListNode midNode = getMid(head);
ListNode rightNode = sortList(midNode.next);
midNode.next = null;
ListNode leftNode = sortList(head);
return merge(leftNode, rightNode);
}
private ListNode merge(ListNode leftNode, ListNode rightNode) {
// if (leftNode == rightNode) {
// return leftNode;
// }
ListNode dummyNode = new ListNode(0);
ListNode tail = dummyNode;
while (leftNode != null && rightNode != null) {
if (leftNode.val < rightNode.val) {
tail.next = leftNode;
leftNode = leftNode.next;
} else {
tail.next = rightNode;
rightNode = rightNode.next;
}
tail = tail.next;
}
if (leftNode != null) {
tail.next = leftNode;
} else if (rightNode != null) {
tail.next = rightNode;
}
return dummyNode.next;
}
private ListNode getMid(ListNode head) {
ListNode fn = head.next, sn = head;
while (fn != null && fn.next != null) {
sn = sn.next;
fn = fn.next.next;
}
return sn;
}
}