算法挑战3

3 阅读1分钟

148.排序链表

这道题是leecode hot100的第148题

难度: 中等

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

思路分析:

  • 找中点:用快慢指针,快指针走两步、慢指针走一步,快指针到末尾时,慢指针正好在中点。

  • 拆分递归:把链表从中间断开,分别递归排序左右两段。

  • 合并有序链表:把两个排好序的小链表,合并成一个大的有序链表

题解语言: js

题解

var sortList = function(head) {

    if (!head || !head.next) return head;

        // 1. 快慢指针找链表中点
    let slow = head;
    let fast = head;
    while (fast.next && fast.next.next) {
        slow = slow.next;
        fast = fast.next.next;
    }
    let mid = slow.next;
    slow.next = null;

     // 2. 递归拆分左右两部分
    let left = sortList(head);
    let right = sortList(mid);

        // 3. 合并两个有序链表
    const dummy = new ListNode(0);
    let p = dummy;
    while (left && right) {
        if (left.val < right.val) {
            p.next = left;
            left = left.next;
        } else {
            p.next = right;
            right = right.next;
        }
        p = p.next;
    }
    // 拼接剩余部分
    p.next = left ? left : right;
    return dummy.next;
};