题目链接
法一(归并排序非递归)
private int length(ListNode head) {
ListNode cur = head;
int len = 0;
while (cur != null) {
len++;
cur = cur.next;
}
return len;
}
private ListNode cut(ListNode head, int step) {
ListNode cur = head;
while (--step != 0 && cur != null) {
cur = cur.next;
}
if (cur == null) {
return null;
} else {
ListNode right = cur.next;
cur.next = null;
return right;
}
}
private ListNode merge(ListNode left, ListNode right) {
ListNode dummy = new ListNode();
ListNode cur = dummy, leftCur = left, rightCur = right;
while (leftCur != null && rightCur != null) {
if (leftCur.val < rightCur.val) {
cur.next = leftCur;
leftCur = leftCur.next;
} else {
cur.next = rightCur;
rightCur = rightCur.next;
}
cur = cur.next;
}
cur.next = leftCur != null ? leftCur : rightCur;
return dummy.next;
}
public ListNode sortList(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
int len = length(head);
for (int step = 1; step < len; step <<= 1) {
ListNode cur = dummy.next, tail = dummy;
while (cur != null) {
ListNode left = cur;
ListNode right = cut(left, step);
cur = cut(right, step);
tail.next = merge(left, right);
while (tail.next != null) {
tail = tail.next;
}
}
}
return dummy.next;
}
法二(归并排序递归)
private ListNode merge(ListNode left, ListNode right) {
ListNode dummy = new ListNode();
ListNode cur = dummy, leftCur = left, rightCur = right;
while (leftCur != null && rightCur != null) {
if (leftCur.val < rightCur.val) {
cur.next = leftCur;
leftCur = leftCur.next;
} else {
cur.next = rightCur;
rightCur = rightCur.next;
}
cur = cur.next;
}
cur.next = leftCur != null ? leftCur : rightCur;
return dummy.next;
}
private ListNode findMiddleNode(ListNode head) {
ListNode slow = head, fast = head, pre = null;
while (fast != null && fast.next != null) {
pre = slow;
slow = slow.next;
fast = fast.next.next;
}
pre.next = null;
return slow;
}
private ListNode mergeSort(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode mid = findMiddleNode(head);
ListNode left = mergeSort(head);
ListNode right = mergeSort(mid);
return merge(left, right);
}
public ListNode sortList_2(ListNode head) {
return mergeSort(head);
}
本地测试
lay.showTitle(148);
Solution148 sol148 = new Solution148();
int[] nums148 = new int[]{-1, 5, 3, 4, 0};
ListNode head148_1 = new ListNode();
head148_1 = listOpt.creatListByArray(head148_1, nums148);
listOpt.showList(head148_1);
ListNode sortHead148_1 = sol148.sortList(head148_1.next);
listOpt.showNoHeadList(sortHead148_1);
ListNode head148_2 = new ListNode();
head148_2 = listOpt.creatListByArray(head148_2, nums148);
ListNode sortHead148_2 = sol148.sortList_2(head148_2.next);
listOpt.showNoHeadList(sortHead148_2);