题目
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表
分析
要求是时间复杂度O(n log n),使用归并排序
fun margeList(head: ListNode): ListNode {
//截止条件
if (head.next == null) {
return head
}
//找到中点中点
var slow = head
var fast = head
while (fast.next != null && fast.next!!.next != null) {
fast = fast.next!!.next!!
slow = slow.next!!
}
val rightHead = slow.next!!
//注意将前半段的最后一个节点的next指针置为null
slow.next = null
var left: ListNode? = margeList(head)
var right: ListNode? = margeList(rightHead)
var curr = ListNode(0)
val result = curr
//比较合并
while (left != null && right != null) {
if (left.`val` < right.`val`) {
curr.next = left
left = left.next
} else {
curr.next = right
right = right.next
}
curr = curr.next!!
}
//合格剩余链表
left.takeIf { it != null }?.let {
curr.next = left
}
right.takeIf { it != null }?.let {
curr.next = right
}
return result.next!!
}
## 关于我
一个希望友友们能提出建议的代码下毒糕手