leetcode:排序链表(递归)

题目:

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

示例 1:

复制代码
输入:head = [4,2,1,3]
输出:[1,2,3,4]

示例 2:

复制代码
输入:head = [-1,5,3,4,0]
输出:[-1,0,3,4,5]

示例 3:

复制代码
输入:head = []
输出:[]

提示:

链表中节点的数目在范围 [0, 5 * 104]

-105 <= Node.val <= 105

代码+思路(注释):

java 复制代码
class Solution {
public ListNode sortList(ListNode head) {
        //直接调用最后结果:head是头,tail==null;也就是结尾null
        return sort(head,null);
    }

    public ListNode mergeTwoLists(ListNode list1,ListNode list2) {
        //归并排序的思想
        //在下一个函数中我们要掉用他
        //这个是合并排序两个升序链表
        //后面我们要切割链表,使他成为2个升序链表
        if (list1 == null) {
            return list2;
        }
        if (list2 == null) {
            return list1;
        }
        ListNode dammyHead = new ListNode(Integer.MAX_VALUE);//虚拟头结点
        ListNode pre = dammyHead;//动的结点//也是新链表的指针
        ListNode cur1 = list1;//两个指针
        ListNode cur2 = list2;
        //开始向新链表插入
        while (cur1 != null && cur2 != null) {
            if (cur1.val > cur2.val) {
                pre.next = cur2;
                cur2 = cur2.next;
            } else {
                pre.next = cur1;
                cur1 = cur1.next;
            }
            pre = pre.next;
        }
        if (cur1 == null) {
            pre.next = cur2;
        }//因为是排好序的2个链表
        else {
            pre.next = cur1;
        }
        return dammyHead.next;//返回虚拟头结点后面部分
    }

    public ListNode sort(ListNode head,ListNode tail){
        //因为链表本身没有排序
        if(head==null){
            return head;
        }
        if(head.next==tail){
            head.next=null;
            return head;
        }
        ListNode node1=head;//两个指针
        //一个快,一个慢
        ListNode node2=head;
        //找中间结点
        while(node2!=tail){
            node1=node1.next;
            node2=node2.next;
            if(node2!=tail){
                node2=node2.next;
            }
        }
        //多次调用sort,每次把各部分再分割
        //在调用合并(归并)函数//每次排一部分
        return mergeTwoLists(sort(head,node1),sort(node1,tail));
    }
}

结果:

相关推荐
We་ct7 小时前
LeetCode 5. 最长回文子串:DP + 中心扩展
前端·javascript·算法·leetcode·typescript
JAVA面经实录91710 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
王老师青少年编程11 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮11 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
天疆说11 小时前
【哈密顿力学】深入解读航天器交会最优控制中的Hamilton函数
人工智能·算法·机器学习
许彰午12 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
wuweijianlove12 小时前
关于算法设计中的代价函数优化与约束求解的技术7
算法
leoufung13 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了13 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
HXDGCL13 小时前
矩形环形导轨:自动化循环线的核心运动单元解析
运维·算法·自动化