LeetCode:148. 排序链表

简介

题目链接:https://leetcode.cn/problems/sort-list/description/

解决方式:链表 + 分治法(递归 + 双指针)

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐看 灵茶山艾府、Krahets 大佬的讲解。

分治法

解题思路:分治分治,分而治之。本题大体上是用递归将大的链表分成两个小的链表,直到小的链表不能再分。之后,就利用双指针按从小到大的顺序合并两个小链表。

需要解决两个前置题目:

    1. 链表的中间结点
    1. 合并两个有序链表
java 复制代码
class Solution {
    public ListNode sortList(ListNode head) {
        // 边界处理(递归终止条件)
        if(head == null || head.next == null){
            return head;
        }
        // 递归公式
        // 得到分开后,第二个链表的头节点
        ListNode head2 = middleNode(head);
        // 分治
        head = sortList(head);
        head2 = sortList(head2);
        // 合并
        return mergeList(head, head2);
    }
    // 双指针寻找中间节点,即第二个链表的头节点
    private ListNode middleNode(ListNode head){
        ListNode slow = head;
        ListNode fast = head.next;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        // 断开链表,分成两个
        ListNode temp = slow.next;
        slow.next = null;
        return temp;
    }
    // 双指针合并两个链表
    private ListNode mergeList(ListNode head, ListNode head2){
        ListNode p1 = head;
        ListNode p2 = head2;
        ListNode p = new ListNode(0);
        ListNode pre = p;
        while(p1 != null && p2 != null){
            if(p1.val > p2.val){
                pre.next = p2;
                p2 = p2.next;
            }else{
                pre.next = p1;
                p1 = p1.next;
            }
            pre = pre.next;
        }
        pre.next = p1 != null ? p1 : p2;
        return p.next;
    }
}
相关推荐
ST——Jess9 分钟前
年度行业趋势研究报告:泛心理数字化赛道“流日推演”的算法困境与高保真交互范式重构
人工智能·算法·架构
Tisfy12 分钟前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
garmin Chen22 分钟前
LeetcodeHot100打卡(14、合并空间,15、轮转数组,16、除了自身以外数组乘积,17.缺失的第一个整数)
java·笔记·学习·算法
elseif12341 分钟前
【C++】vector 详细版
开发语言·c++·算法
变量未定义~1 小时前
既约分数、阶乘约数、逆元、最大质因子个数【算法赛】
算法
KaMeidebaby1 小时前
卡梅德生物技术快报|Western Blot 实验应用:肺肠轴机制研究全流程技术解析
前端·数据库·人工智能·算法·百度
AhriProGramming2 小时前
计算机科普故事会-<2>见微知著
算法
BD4SXV2 小时前
线性二次调节器(Linear Quadratic Regulator,LQR)的无限时域最优控制求解与黎卡提方程
算法·自动化
ST——Jess2 小时前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构