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

leetcode 725 分割链表

leetcode 725 分割链表

在这里插入图片描述

解题思路

1、计算链表长度:
首先遍历整个链表,得到总长度length,这是分割的基础
2、确定各部分长度:
计算基础长度base_len = length / k,这是每个部分至少包含的节点数
计算多余节点数extra = length % k,前extra个部分会各多 1 个节点
3、执行分割:
创建一个大小为 k 的结果数组,初始值都为 nullptr
遍历 k 次,每次处理一个部分:
记录当前部分的头节点
根据是否是前extra个部分,确定当前部分的实际长度
移动指针到当前部分的末尾
断开与后续节点的连接,完成当前部分的分割

这种方法确保了:

前extra个部分比其他部分多 1 个节点
各部分长度差不超过 1
前面的部分长度大于或等于后面的部分
当链表长度小于 k 时,后面的部分会为 null

时间复杂度为 O (n + k),其中 n 是链表长度;空间复杂度为 O (k) 用于存储结果。

  vector<ListNode*> splitListToParts(ListNode* head, int k) {// 1. 计算链表总长度int length = 0;ListNode* current = head;while (current) {length++;current = current->next;}// 2. 计算每个部分的基础长度和多余的节点数int base_len = length / k;   // 每个部分至少有的节点数int extra = length % k;      // 前extra个部分会多1个节点// 3. 分割链表vector<ListNode*> result(k, nullptr);current = head;for (int i = 0; i < k; i++) {result[i] = current;  // 记录当前部分的头节点// 计算当前部分的长度int current_len = base_len + (i < extra ? 1 : 0);// 移动到当前部分的末尾(如果有节点的话)for (int j = 1; j < current_len && current; j++) {current = current->next;}// 断开链表连接if (current) {ListNode* next = current->next;current->next = nullptr;current = next;}}return result;}
http://www.dtcms.com/a/283177.html

相关文章:

  • 微算法科技研究量子视觉计算,利用量子力学原理提升传统计算机视觉任务的性能
  • Kafka入门
  • 语音增强论文汇总
  • Go基本数据类型
  • 81、面向服务开发方法
  • Redisson实现分布式锁
  • Redisson实现限流器详解:从原理到实践
  • HTML 入门教程:从零开始学习网页开发基础
  • 前端知识:浏览器工作原理与开发者工具知识笔记
  • WIN10系统优化篇(一)
  • Leetcode 02 java
  • IDEA报错“资源找不到”?重启就好了!!?
  • 使用Dify构建HR智能助理,深度集成大模型应用,赋能HR招聘管理全流程,dify相关工作流全开源。
  • 城市蓝影.
  • 服务注册nacos和OpenFerign(用于封装跨服务之间的调用方法)
  • kubernetes学习笔记(一)
  • 数据结构 双向链表(2)--双向链表的实现
  • 黄仁勋链博会演讲实录:脱掉皮衣,穿上唐装,中文开场
  • 完善评论发布功能
  • PHP面向对象编程:类与对象的基础概念与实践
  • 从0到1搭建Lazada账号矩阵:自养号测评的精细化养号全攻略
  • Linux 定时器应用示例
  • 功能测试和回归测试
  • C# WPF后台设置控件样式失效的解决方法
  • 【Vue】tailwindcss + ant-design-vue + vue-cropper 图片裁剪功能(解决遇到的坑)
  • 从规模到效率:大模型三大定律与Chinchilla定律详解
  • 实现通讯录人员选择
  • IKE学习笔记
  • Java强化:多线程及线程池
  • 从电子管到CPU