描述
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
思路
分治思想
1. 将链表切成两份 一直切到无法再切
2. 将切完的链表 合并 (参考21. 合并两个有序链表)
实现
func sortList(head *ListNode) *ListNode {
left, right := curList(head)
if left != nil && left.Next != nil{
left = sortList(left)
}
if right != nil && right.Next != nil{
right = sortList(right)
}
return mergeList(left, right)
}
func curList(head *ListNode)(*ListNode, *ListNode){
if head == nil{
return nil, nil
}
fast := head.Next
slow := head
for fast != nil && fast.Next != nil{
fast = fast.Next.Next
slow = slow.Next
}
slowNext := slow.Next
slow.Next = nil
return head, slowNext
}
func mergeList(list1 *ListNode, list2 *ListNode) *ListNode {
if list1 == nil {
return list2
} else if list2 == nil {
return list1
}
var head = new(ListNode)
var cur = head
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
cur.Next = list1
list1 = list1.Next
} else {
cur.Next = list2
list2 = list2.Next
}
cur = cur.Next
}
if list1 == nil {
cur.Next = list2
} else {
cur.Next = list1
}
return head.Next
}