【LeetCode热题100】--148.排序链表

news/2024/7/23 23:22:21 标签: leetcode, 链表, 算法

148.排序链表

image-20231002221349966

链表进行排序最适合的算法就是归并排序:
链表自顶向下归并排序的过程:

  • 找到链表的中点,以中点为分界,将链表拆分成两个子链表,寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2步,慢指针每次移动 1步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点
  • 对两个子链表分别排序
  • 将两个排序后的子链表合并,得到完整的排序后的链表

上述过程可以通过递归实现。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1个节点时,不需要对链表进行拆分和排序。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode sortList(ListNode head) {
        return sortList(head,null);
    }    
    public ListNode sortList(ListNode head,ListNode tail){
        if(head == null){
            return head;
        }
        if(head.next == tail){
            head.next = null;
            return head;
        }
        ListNode slow = head,fast = head;
        while(fast != tail){
            slow = slow.next;
            fast = fast.next;
            if(fast!=tail){
                fast = fast.next;
            }
        }
        ListNode mid = slow;
        ListNode list1 = sortList(head,mid);
        ListNode list2= sortList(mid,tail);
        ListNode sorted = merge(list1,list2);
        return sorted;

    }
    public ListNode merge(ListNode head1,ListNode head2){  //合并两个有序链表
        ListNode dummy = new ListNode(0);
        ListNode temp = dummy,temp1 = head1,temp2 = head2;
        while(temp1 !=null &&temp2 !=null){
            if(temp1.val <= temp2.val){
                temp.next = temp1;
                temp1 = temp1.next;
            }else{
                temp.next = temp2;
                temp2 = temp2.next;
            }
            temp = temp.next;
        }
        if(temp1!=null){
            temp.next = temp1;
        }else if(temp2!=null){
            temp.next = temp2;
        }
        return dummy.next;

    }
}

http://www.niftyadmin.cn/n/5063534.html

相关文章

[Spring] Spring5——IOC 简介(二)

目录 六、工厂 Bean&#xff08;Factory&#xff09; 1、普通 bean 2、工厂 bean 3、示例 七、Bean 的作用域 1、单例和多例 2、如何设置为单实例或多实例 八、Bean 的生命周期 1、生命周期 2、生命周期示例 3、Bean 的后置处理器 4、后置处理器示例 九、XML 的自…

Spring 框架知识点汇总 (持续更新)

1、<context:annotation-config /> 标签 Spring MVC的配置方案&#xff0c;标签会自动注册下列的4个bean: 1) AutowiredAnnotationBeanPostProcessor 对应于使用AutoWired注解 2)CommondAnnotationBeanPostProcessor 对应于使用Resource、PostConstruct、Predestor…

采集SEO方法-添加链接段落

采集大量的文章数据&#xff0c;要想批量做SEO添加链接段落方法&#xff0c;可以使用简数采集器的处理规则实现。 简数采集器的一个处理规则&#xff0c;可以包含多种SEO方法&#xff0c;还可自由组合&#xff0c;强大灵活方便。 添加补充链接段落的SEO技巧&#xff1a; 1&a…

【项目】web服务器

socket 套接字&#xff1a;所谓 socket&#xff08;套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象&#xff0c;一个套接字就是网络上进程通信的一端&#xff0c;是应用程序通过网络协议进行通信的接口。socket 可以看成是两个网…

1.8.C++项目:仿muduo库实现并发服务器之eventloop模块的设计

项目完整在&#xff1a; 文章目录 一、eventloop模块&#xff1a;进行事件监控&#xff0c;以及事件处理的模块二、提供的功能三、实现思想&#xff08;一&#xff09;功能&#xff08;二&#xff09;意义&#xff08;三&#xff09;功能设计 四、框架五、代码 一、eventloop模…

常见编写JavaScript代码时容易出现的错误(4)

目录 前言1.未考虑性能问题&#xff08;Ignoring Performance Concerns&#xff09;错误示例解决方法 2.未处理依赖关系&#xff08;Unmanaged Dependencies&#xff09;错误示例解决方法 3.混淆的命名&#xff08;Confusing Naming&#xff09;错误示例解决方法 4.忽略跨浏览器…

消费者提交已消费的偏移量

1.概述 消费者而在消费了消息之后会把消费的offset提交到 __consumer_offsets-的内置Topic中&#xff1b;每个消费者组都有维护一个当前消费者组的offset。那么问题来了: 消费组什么时候把offset更新到broker中的分区中呢&#xff1f; Kafka消费者的配置信息 Name描述default…

2024北京智慧养老展,北京养老应用软件展,北京陪护机器人展

2024第11届中国&#xff08;北京&#xff09;国际智慧养老产业展览会 The 2024 China (Beijing) international pension Industry Exhibition 时间&#xff1a;2024年04月10日—12日 展馆&#xff1a;北京亦创国际会展中心 承办&#xff1a;北京联诚国际展览有限公司 大会概要…