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));
    }
}

结果:

相关推荐
2201_757830877 分钟前
条件分页查询
java·开发语言
LYFlied9 分钟前
【每日算法】LeetCode 105. 从前序与中序遍历序列构造二叉树
数据结构·算法·leetcode·面试·职场和发展
重生之我是Java开发战士11 分钟前
【数据结构】Java对象的比较
java·jvm·数据结构
DanyHope15 分钟前
LeetCode 206. 反转链表:迭代 + 递归双解法全解析
算法·leetcode·链表·递归·迭代
橘子1318 分钟前
Linux线程——一些概念(七)
java·redis·缓存
NAGNIP18 分钟前
才发现TensorBoard是个可视化的神器!
算法
magic_kid_201022 分钟前
IDEA 复制到 Windows 远程桌面失败的原因与解决方案
java·ide·intellij-idea
风月歌23 分钟前
基于微信小程序的学习资料销售平台源代码(源码+文档+数据库)
java·数据库·mysql·微信小程序·小程序·毕业设计·源码
历程里程碑24 分钟前
C++ 16:C++11新特化
c语言·开发语言·数据结构·c++·经验分享
_dindong24 分钟前
算法杂谈:回溯路线
数据结构·算法·动态规划·bfs·宽度优先