148. Sort List

26 年 1 月 19 日 星期一
308 字
2 分钟

148. Sort List

Screenshot 2026-01-19 at 9.41.52 pm

基本思想:归并排序(先分成最小单位,然后按序合并,用递归实现)

归并算法和下面类似

python
def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    # 分解:将列表分成两半
    mid = len(arr) // 2
    left_half = merge_sort(arr[:mid])  # 递归排序左半部分
    right_half = merge_sort(arr[mid:])  # 递归排序右半部分

    # 合并:将两个有序子列表合并
    return merge(left_half, right_half)

ref: https://www.runoob.com/w3cnote/merge-sort.html

js
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */

// 找到中间节点
// divide linked list
const middleNode = (head) => {
  let slow = head
  let fast = head
  let pre = head
  while (fast && fast.next) {
    pre = slow //记录slow前一个节点
    slow = slow.next
    fast = fast.next.next
  }
  pre.next = null
  return slow
}

// 合并两个有序数组
const mergeLinkedList = (head1, head2) => {
  if (head1 === null) {
    return head2
  } else if (head2 === null) {
    return head1
  } else if (head1.val > head2.val) {
    head2.next = mergeLinkedList(head1, head2.next)
    return head2
  } else {
    head1.next = mergeLinkedList(head1.next, head2)
    return head1
  }
}

var sortList = function (head) {
  // 归并排序
  // 空或者只有一个节点不用排序
  if (head === null || head.next === null) {
    return head
  }
  const middle = middleNode(head)
  const left = sortList(head)
  const right = sortList(middle)
  return mergeLinkedList(left, right)
}

文章标题:148. Sort List

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/148_sort_list[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。