面试题 08.06. 汉诺塔问题

  • 时间复杂度O(nlogn)
  • 归并排序
class Solution {
public ListNode sortList(ListNode head) {
return sortList(head, null);
}
// 左右分别排序,然后合并
public ListNode sortList(ListNode head, ListNode tail) {
if (head == null) {
return head;
}
if (head.next == tail) {
head.next = null;
return head;
}
ListNode mid = head, fast = head;
while (fast != tail) {
mid = mid.next;
fast = fast.next;
if (fast != tail) {
fast = fast.next;
}
}
ListNode left = sortList(head, mid);
ListNode right = sortList(mid, tail);
ListNode sorted = merge(left, right);
return sorted;
}
// 合并排序
public ListNode merge(ListNode left, ListNode right) {
ListNode head = new ListNode(0);
ListNode temp = head, leftTemp = left, rightTemp = right;
while (leftTemp != null && rightTemp != null) {
if (leftTemp.val <= rightTemp.val) {
temp.next = leftTemp;
leftTemp = leftTemp.next;
}else {
temp.next = rightTemp;
rightTemp = rightTemp.next;
}
temp = temp.next;
}
if (leftTemp != null) {
temp.next = leftTemp;
} else if (rightTemp != null) {
temp.next = rightTemp;
}
return head.next;
}
}