148. 排序链表

80 阅读1分钟

题目

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表

148. 排序链表

分析

要求是时间复杂度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!!
}
## 关于我
一个希望友友们能提出建议的代码下毒糕手