当前位置: 首页 > news >正文

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

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.lryc.cn/news/180795.html

相关文章:

  • 分布式并行训练(DP、DDP、DeepSpeed)
  • Linux- fg命令 bg命令
  • leetcode第362场周赛
  • 图神经网络GNN(一)GraphEmbedding
  • 多目标平衡优化器黏菌算法(MOEOSMA)求解CEC2020多模式多目标优化
  • 快速开发微信小程序之一登录认证
  • Mybatis配置文件(mybatis-config.xml)和Mapper映射文件(XXXMapper.xml)模板
  • 4. 条件查询
  • 【VIM】初步认识VIM-2
  • 《HelloGitHub》第 90 期
  • Apache Hudi初探(五)(与flink的结合)--Flink 中hudi clean操作
  • stream对list数据进行多字段去重
  • 一种基于体素的射线检测
  • 利用Docker安装Protostar
  • go基础语法10问
  • SpringCloud + SpringGateway 解决Get请求传参为特殊字符导致400无法通过网关转发的问题
  • vim基本操作
  • Drift plus penalty 漂移加惩罚Part1——介绍和工作原理
  • (四)动态阈值分割
  • jvm介绍
  • 数据结构与算法课后题-第三章(顺序队和链队)
  • SSM - Springboot - MyBatis-Plus 全栈体系(十六)
  • k8s--storageClass自动创建PV
  • 7.3 调用函数
  • 如果使用pprof来进行性能的观测和优化
  • 在移动固态硬盘上安装Ubuntu系统和ROS2
  • 【iptables 实战】02 iptables常用命令
  • webview_flutter
  • 【GESP考级C++】1级样题 闰年统计
  • CentOS密码重置