63 lines
1.1 KiB
Go
63 lines
1.1 KiB
Go
package main
|
|
|
|
func conquerAndSort(head *ListNode, end *ListNode) *ListNode {
|
|
if head == nil || head == end || head.Next == nil {
|
|
return head
|
|
}
|
|
if head.Next == end {
|
|
if end != nil {
|
|
if head.Val > end.Val {
|
|
head.Val, end.Val = end.Val, head.Val
|
|
}
|
|
}
|
|
return head
|
|
}
|
|
if head.Next.Next == end {
|
|
if head.Val > head.Next.Val {
|
|
head.Next.Val, head.Val = head.Val, head.Next.Val
|
|
}
|
|
return head
|
|
}
|
|
slow, fast := head, head
|
|
for fast.Next != nil && fast.Next.Next != nil {
|
|
slow = slow.Next
|
|
fast = fast.Next.Next
|
|
}
|
|
lastSlow := slow
|
|
slow = slow.Next
|
|
lastSlow.Next = nil
|
|
a := conquerAndSort(head, nil)
|
|
b := conquerAndSort(slow, end)
|
|
if a.Val > b.Val {
|
|
a, b = b, a
|
|
}
|
|
// a Val < b Val
|
|
head = a
|
|
cur := a
|
|
a = a.Next
|
|
for a != nil && b != nil {
|
|
if a.Val > b.Val {
|
|
cur.Next = b
|
|
b = b.Next
|
|
} else {
|
|
cur.Next = a
|
|
a = a.Next
|
|
}
|
|
cur = cur.Next
|
|
}
|
|
if a == nil {
|
|
cur.Next = b
|
|
} else {
|
|
cur.Next = a
|
|
}
|
|
return head
|
|
}
|
|
func sortList(head *ListNode) *ListNode {
|
|
return conquerAndSort(head, nil)
|
|
}
|
|
|
|
func main() {
|
|
arr := []int{-1, 5, 3, 4, 0}
|
|
checkLink(sortList(makeLink(arr)))
|
|
}
|