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

OJ题之单链表排序

描述

给定一个节点数为n的无序单链表,对其按升序排序。

数据范围:0<n≤1000000<n≤100000,保证节点权值在[−109,109][−109,109]之内。

要求:空间复杂度 O(n),时间复杂度 O(nlogn)

给出以下三种方式:

1. 冒泡排序

通过重复遍历链表,比较相邻元素并交换位置,直到整个链表有序。

void bubbleSort(ListNode* head) {if (!head) return;bool swapped;do {swapped = false;ListNode* current = head;while (current->next) {if (current->val > current->next->val) {std::swap(current->val, current->next->val);swapped = true;}current = current->next;}} while (swapped);
}

2. 选择排序

每次遍历链表找到最小元素,将其与当前元素交换位置。

void selectionSort(ListNode* head) {for (ListNode* current = head; current; current = current->next) {ListNode* minNode = current;for (ListNode* nextNode = current->next; nextNode; nextNode = nextNode->next) {if (nextNode->val < minNode->val) {minNode = nextNode;}}std::swap(current->val, minNode->val);}
}

3. 合并排序

采用分治法,将链表分成两半,递归地排序每一半,然后合并两个已排序的链表。

ListNode* merge(ListNode* l1, ListNode* l2) {ListNode dummy(0);ListNode* tail = &dummy;while (l1 && l2) {if (l1->val < l2->val) {tail->next = l1;l1 = l1->next;} else {tail->next = l2;l2 = l2->next;}tail = tail->next;}tail->next = l1 ? l1 : l2;return dummy.next;
}ListNode* mergeSort(ListNode* head) {if (!head || !head->next) return head;ListNode* slow = head;ListNode* fast = head->next;while (fast && fast->next) {slow = slow->next;fast = fast->next->next;}ListNode* mid = slow->next;slow->next = nullptr;return merge(mergeSort(head), mergeSort(mid));
}

相关文章:

  • 14年408-计算机网络
  • 【车联网安全】车端知识调研
  • git commit -am 仅提交已修改文件
  • 手机实时提取SIM卡打电话的信令声音-新的篇章(二、USB音频线初步探索)
  • 如何用Python监控本股市的方法
  • 网络安全入门
  • [Day 80] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
  • java项目实现钉钉异常告警实时监控
  • Hadoop 性能优化高频面试题及答案
  • 软件设计之SSM(2)
  • 云原生周刊:Argo CD v2.13 发布候选版本丨2024.9.30
  • 超声波扫描仪存储芯片S3A1604V0M
  • 被Karpathy誉为“蕴藏着类似ChatGPT的机会的AI产品Notebook LM”,它到底做对了什么?
  • 二叉树相关oj题(Java)
  • 基于大数据的高校新生数据可视化分析系统
  • 自己简单写的 事件订阅机制
  • .pyc 想到的一些问题
  • [笔记] php常见简单功能及函数
  • 【刷算法】从上往下打印二叉树
  • Apache的基本使用
  • echarts的各种常用效果展示
  • HomeBrew常规使用教程
  • Java|序列化异常StreamCorruptedException的解决方法
  • Java反射-动态类加载和重新加载
  • Java教程_软件开发基础
  • Kibana配置logstash,报表一体化
  • Making An Indicator With Pure CSS
  • mongo索引构建
  • Rancher如何对接Ceph-RBD块存储
  • Shadow DOM 内部构造及如何构建独立组件
  • sublime配置文件
  • VUE es6技巧写法(持续更新中~~~)
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 用mpvue开发微信小程序
  • 正则与JS中的正则
  • Python 之网络式编程
  • ​configparser --- 配置文件解析器​
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (30)数组元素和与数字和的绝对差
  • (LeetCode 49)Anagrams
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (九)c52学习之旅-定时器
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)glDrawArry绘制
  • (三)模仿学习-Action数据的模仿
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)