[LeetCode] Split Linked List in Parts 拆分链表成部分
Given a (singly) linked list with head node root, write a function to split the linked list into k consecutive linked list "parts".
The length of each part should be as equal as possible: no two parts should have a size differing by more than 1. This may lead to some parts being null.
The parts should be in order of occurrence in the input list, and parts occurring earlier should always have a size greater than or equal parts occurring later.
Return a List of ListNode's representing the linked list parts that are formed.
Examples 1->2->3->4, k = 5 // 5 equal parts [ [1], [2], [3], [4], null ]
Example 1:
Input:
root = [1, 2, 3], k = 5
Output: [[1],[2],[3],[],[]]
Explanation:
The input and each element of the output are ListNodes, not arrays.
For example, the input root has root.val = 1, root.next.val = 2, \root.next.next.val = 3, and root.next.next.next = null.
The first element output[0] has output[0].val = 1, output[0].next = null.
The last element output[4] is null, but it's string representation as a ListNode is [].
Example 2:
Input:
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
Explanation:
The input has been split into consecutive parts with size difference at most 1, and earlier parts are a larger size than the later parts.
Note:
- The length of
rootwill be in the range[0, 1000]. - Each value of a node in the input will be an integer in the range
[0, 999]. kwill be an integer in the range[1, 50].
这道题给我们一个链表和一个正数k,让我们分割链表成k部分,尽可能的平均分割,如果结点不够了,就用空结点,比如例子1中的。如果无法平均分,那么多余的结点就按顺序放在子链表中,如例子2中所示。我们要知道每个部分结点的个数,才能将整个链表断开成子链表,所以我们首先要统计链表中结点的总个数,然后除以k,得到的商avg就是能分成的部分个数,余数ext就是包含有多余的结点的子链表的个数。我们开始for循环,循环的结束条件是i小于k且root存在,要生成k个子链表,在循环中,先把头结点加入结果res中对应的位置,然后就要遍历该子链表的结点个数了,首先每个子链表都一定包含有avg个结点,这是之前除法得到的商,然后还要有没有多余结点,如果i小于ext,就说明当前子链表还得有一个多余结点,然后我们将指针向后移动一个,注意我们这里的j是从1开始,我们希望移动到子链表的最后一个结点上,而不是移动到下一个子链表的首结点,因为我们要断开链表。我们新建一个临时结点t指向下一个结点,也就是下一个子链表的首结点,然后将链表断开,再将root指向临时结点t,这样就完成了断开链表的操作,参见代码如下:
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> res(k);
int len = ;
for (ListNode *t = root; t; t = t->next) ++len;
int avg = len / k, ext = len % k;
for (int i = ; i < k && root; ++i) {
res[i] = root;
for (int j = ; j < avg + (i < ext); ++j) {
root = root->next;
}
ListNode *t = root->next;
root->next = NULL;
root = t;
}
return res;
}
};
下面的内容和本题无关,是博主对于这个感恩节刷屏的大事,国内某恶魔色幼儿园的侵害幼童事件的看法。博主经常听人说,贫穷限制了我们的想象,意思是你永远无法了解富人生活的奢华程度。同样的道理,博主要说,善良限制了我们的想象,你永远无法想象这个世界恶魔的邪恶程度。鲁迅先生说,我向来不惮以最坏的恶意揣测中国人,实际应该改成,我向来不惮以最坏的恶意揣测人类。人性中的恶就像潘多拉的盒子,在没有限制和约束的时候就会被打开,飞出去祸害众生。幼童是人的一生中可以说性格形成的重要时期,也是最脆弱最容易受到伤害的时期,多少变态的罪犯都是有过幼年时期被侵害的经历,形成了畸形的人格,幼年时期被侵害就像被在心中种下了恶,恶之花结出了恶果从而再去侵害其他无辜的人,形成了恶性循环,贻害无穷。难以想象,是什么样扭曲的心灵可以对那么天真无邪的儿童下得去毒手。毕竟这些受侵害的孩子还有父母,侵害还是可能被发现,博主不敢想象孤儿院或者聋哑学校的那些可怜的孩子遭受了侵害,谁会为他们伸张正义。韩国拍出了《熔炉》,《素媛》这些伟大的电影去直面人性中的恶,其中《熔炉》更是推动了韩国对于幼童侵害方面的立法的完善。欣慰的是,国内近期上映的《嘉年华》也是一部反映社会问题的电影,希望能有多一些这类型的电影出现,直到成为中国《熔炉》,改变完善国内相关保障儿童安全的法案。另一方面,家长们也需要加强对于幼童这方面的教育,这一点美国做的能好一些,他们不会让陌生人轻易碰触,估计家长的功课做的比较足。这边的学校也会让做在线的儿童保护的trainning,说明还是相当重视的。国内由于种种原因,对于性教育这方面总感觉能拖就拖,或者干脆自己去领悟,记得之前某出版社曾推出过一本幼童性教育的书,后来因为家长们的强烈反对没有使用,博主也看了,当时偏向于保守的博主也觉得的这书有些“少儿不宜”,但是现在看来,与其被坏人侵害,还不如早些普及这些知识,及早预防,毕竟你觉得孩子小,不应该接触这些东西,但是坏人不会觉得你孩子小而不施加侵害。希望善恶到头终有报,希望世上能少一些罪恶,多一些美好。
类似题目:
参考资料:
https://discuss.leetcode.com/topic/110475/c-solution-o-1-space-9ms
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Split Linked List in Parts 拆分链表成部分的更多相关文章
- LeetCode 725. Split Linked List in Parts (分裂链表)
Given a (singly) linked list with head node root, write a function to split the linked list into k c ...
- 725. Split Linked List in Parts把链表分成长度不超过1的若干部分
[抄题]: Given a (singly) linked list with head node root, write a function to split the linked list in ...
- LC 725. Split Linked List in Parts
Given a (singly) linked list with head node root, write a function to split the linked list into k c ...
- LeetCode 725. Split Linked List in Parts(分隔链表)
题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度. 分析: (1)首先计算链表总长len (2)根据len得到分隔的链表长度要么为size, ...
- [leetcode]725. Split Linked List in Parts链表分块
思路很简单 按时链表的题做起来很容易犯小错误,思维要缜密 还要多练习啊 做之前最好画算法框图 public ListNode[] splitListToParts(ListNode root, in ...
- [Swift]LeetCode725. 分隔链表 | Split Linked List in Parts
Given a (singly) linked list with head node root, write a function to split the linked list into k c ...
- 【LeetCode】725. Split Linked List in Parts 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- #Leetcode# 725. Split Linked List in Parts
https://leetcode.com/problems/split-linked-list-in-parts/ Given a (singly) linked list with head nod ...
- 【Leetcode】725. Split Linked List in Parts
Given a (singly) linked list with head node root, write a function to split the linked list into k c ...
随机推荐
- bashell基础
身为一个iOS程序员,虽然iOS相关技术十分重要,但是bash也是不可不了解的,因为技能的成长,除了深度,还需要广度.下面就来介绍下bash. Shell是C语言编写的,所以他是解释性语言,运行在Li ...
- 跟着大神学zookeeper分布式锁实现-----来自Ruthless
前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...
- 基础补充:使用xlrd模块读取excel文件
因为接口测试用例使用excel文件来维护的,所以有必要学习下操作excel的基本方法 参考博客:python 3 操作 excel 把自己练习的代码贴出来,是一些基本的操作,每行代码后面都加了注释. ...
- 20162318 实验三《 敏捷开发与XP实践》实验报告
北京电子科技学院(BESTI) 实 验 报 告 课程:程序设计与数据结构 班级:1623班 姓名:张泰毓 指导老师:娄老师.王老师 实验日期:2017年5月12日 实验密级:非密级 实验器材:带Lin ...
- python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
知识储备,简单爬虫的必知必会,[核心] 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌 ...
- NOIP2016 天天爱跑步 80分暴力
https://www.luogu.org/problem/show?pid=1600 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.«天天爱跑步»是一个养 ...
- eclipse maven项目目录
今天遇见一个错误,关于eclipse项目的路径问题,web-inf的路径,上图和下图出现了两种web-INF,src的web-INFf和webContent的web-INF,src里面的文件需要编译以 ...
- 使用 vi 命令
一.vi是什么 vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器. Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实 ...
- GIT入门笔记(15)- 链接到私有GitLab仓库
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理 ...
- Linux实用的网站
ABCDOCKER网站 https://www.abcdocker.com/ 徐亮伟网站 http://www.xuliangwei.com/ 安装centos物理服务 ...