# LeetCode 热题 HOT 100 Java题解——148. 排序链表

## 148. 排序链表

O ( n l o g n ) O(n log n) 时间复杂度和常数级空间复杂度下，对链表进行排序。

输入: 4->2->1->3



### 递归+归并

class Solution {
while(fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
ListNode ret = slow.next;
slow.next = null;
return ret;
}
public ListNode merge(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(), p = dummy;
while(l1 != null && l2 != null) {
if (l1.val < l2.val) {
p.next = l1;
l1 = l1.next;
}else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
p.next = l1 != null ? l1 : l2;
return dummy.next;
}
return merge(left, right);
}
}


#### 复杂度分析

• 时间复杂度： O ( n l o g n ) O(nlogn)

每次归并复杂度为 O ( n ) O(n) ，递归调用复杂度为 O ( l o g n ) O(logn) ，因此总复杂度为 0 ( n l o g n ) 0(nlogn)

• 空间复杂度： O ( l o g n ) O(logn)

递归栈深度 O ( l o g n ) O(logn)

### 迭代+归并

class Solution {
public ListNode cut(ListNode head, int n) {
while(head != null && n > 1) {
n--;
}
if (head == null) return null;
return ret;
}
public ListNode merge(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(), p = dummy;
while(l1 != null && l2 != null) {
if (l1.val < l2.val) {
p.next = l1;
l1 = l1.next;
}else {
p.next = l2;
l2 = l2.next;
}
p = p.next;
}
p.next = l1 != null ? l1 : l2;
return dummy.next;
}
int len = 0;
while(p != null) {
len++;
p = p.next;
}
ListNode dummy = new ListNode();
for (int i = 1; i < len; i *= 2) {
ListNode cur = dummy.next;
ListNode tail = dummy;
while(cur != null) {
ListNode left = cur;
ListNode right = cut(left, i);
cur = cut(right, i);
tail.next = merge(left, right);
while(tail.next != null) tail = tail.next;
}
}
return dummy.next;
}
}


#### 复杂度分析

• 时间复杂度： O ( n l o g n ) O(nlogn)

归并复杂度为 O ( n ) O(n) ，递归调用复杂度为 O ( l o g n ) O(logn) ，因此总复杂度为 0 ( n l o g n ) 0(nlogn)

• 空间复杂度： O ( 1 ) O(1)

常量级额外空间。

02-11 4847

07-02 1055
02-12 1452
08-01 2245
03-28 1491
07-11 5192
04-09 1502
01-10 784