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 root will be in the range [0, 1000].
  • Each value of a node in the input will be an integer in the range [0, 999].
  • k will 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,说明还是相当重视的。国内由于种种原因,对于性教育这方面总感觉能拖就拖,或者干脆自己去领悟,记得之前某出版社曾推出过一本幼童性教育的书,后来因为家长们的强烈反对没有使用,博主也看了,当时偏向于保守的博主也觉得的这书有些“少儿不宜”,但是现在看来,与其被坏人侵害,还不如早些普及这些知识,及早预防,毕竟你觉得孩子小,不应该接触这些东西,但是坏人不会觉得你孩子小而不施加侵害。希望善恶到头终有报,希望世上能少一些罪恶,多一些美好。

类似题目:

Rotate List

Odd Even Linked List

参考资料:

https://discuss.leetcode.com/topic/110475/c-solution-o-1-space-9ms

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] Split Linked List in Parts 拆分链表成部分的更多相关文章

  1. 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 ...

  2. 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 ...

  3. 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 ...

  4. LeetCode 725. Split Linked List in Parts(分隔链表)

    题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度. 分析: (1)首先计算链表总长len (2)根据len得到分隔的链表长度要么为size, ...

  5. [leetcode]725. Split Linked List in Parts链表分块

    思路很简单  按时链表的题做起来很容易犯小错误,思维要缜密 还要多练习啊 做之前最好画算法框图 public ListNode[] splitListToParts(ListNode root, in ...

  6. [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 ...

  7. 【LeetCode】725. Split Linked List in Parts 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. #Leetcode# 725. Split Linked List in Parts

    https://leetcode.com/problems/split-linked-list-in-parts/ Given a (singly) linked list with head nod ...

  9. 【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 ...

随机推荐

  1. JAVA多线程实现和应用总结

    1.JAVA多线程实现方式JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中 ...

  2. Repeating Decimals UVA - 202

    The / repeats indefinitely with no intervening digits. In fact, the decimal expansion of every ratio ...

  3. 云服务器Windows Server2012 配置http服务器(又称Web服务器,IIS)

    出错:无法打开运行空间池.服务器管理器WinRM插件可能已损坏或丢失. 解决方法: http://shiyousan.com/post/636308065767125916 第一步是开启WinRM服务 ...

  4. Ubuntu下tomcat或eclipse启动提示没有java环境问题

    tomcat和eclipse默认使用了openjdk,通过压缩包安装的jdk无法被识别,通过修改tomcat/bin下的catalina.sh添加jdk和jre路径即可 sudo gedit cata ...

  5. io多路复用(二)

    服务端 import socket sk1 = socket.socket() sk1.bind(('127.0.0.1',8001,)) sk1.listen() inputs = [sk1,] i ...

  6. NetFPGA Demo ——reference_router_nf1_cml

    NetFPGA Demo --reference_router_nf1_cml 前言 本博文主要介绍了reference_router_nf1_cml该demo的一路运行,以及一路上艰难跑通遇到的坑. ...

  7. angular4学习笔记整理(二)angular4的路由使用

    这章说一下angular的路由 先说angular路由怎么引入,一开始new出来的angular项目它路由帮你配好了,但看要看app.module.ts里面 1.首先最上面要引入路由模块 import ...

  8. Python内置函数(2)——divmod

    英文文档: divmod(a, b) Take two (non complex) numbers as arguments and return a pair of numbers consisti ...

  9. 如何排查CPU飙升的Java问题

    1. JPS 查看jvm进程 2. 显示线程列表 ps -mp pid -o THREAD,tid,time 找到了耗时最高的线程tid 3. tid转换成16进制 printf "%x\n ...

  10. HTTP协议的消息头:Content-Type和Accept的作用

    一.背景知识 1.概述 Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报头结构:通用报头|响应报头|实体报头 Acc ...