leetcode725-Split Linked List in Parts

题目

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。

示例 1:

输入:head = [1,2,3], k = 5

输出:[[1],[2],[3],[],[]]

解释:

第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。

最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。

分析

既然要分成k组,那么确认好每组的元素个数就可以了(总元素/k即可),因为不是均分,所以需要把余数(总元素%k)按照1分摊到每组里

java 复制代码
public class LinkNode {
	int val;
	LinkNode next;

	public LinkNode(int data) {
		this.val = data;
		this.next = null;
	}
}
public class LinkList {
	LinkNode head;
	public LinkList() {
		this.head = null;
	}
	public LinkNode getHead() {
		return this.head;
	}
	//添加元素
	public void addNode(int data) {
		LinkNode node = new LinkNode(data);
		if (this.head == null) {
			this.head = node;
		} else {
			LinkNode cur = this.head;
			while(cur.next != null) {
				cur = cur.next;
			}
			cur.next = node;
		}
	}
	//正序打印
	public void print(LinkNode node) {
		while(node != null) {
			System.out.print(node.val);
			System.out.print(" ");
			node = node.next;
		}
		System.out.println();
	}
	public void split(int k) {
		int cnt = 0;
		LinkNode p = this.head;
		while(p != null) {
			cnt++;
			p = p.next;
		}
		int divRes = cnt / k;
		int divRest = cnt % k;
		p = this.head;
		LinkNode[] splitArray = new LinkNode[k];
		for(int i = 0;i<k && p != null;i++) {
			splitArray[i] = p;
			int tot = 0;
			if(i<divRest) {
				tot = divRes + 1;
			} else {
				tot= divRes;
			}
			for(int j = 1;j<tot;j++) {
				p = p.next;
			}
			LinkNode t = p.next;
			p.next = null;
			p = t;
		}
		for(int i = 0;i<k;i++) {
			LinkNode newHead = splitArray[i];
			print(newHead);
		}
	}
}
public class splitLinkedListinParts {
	public static void main(String[] args) {
		LinkList list = new LinkList();
		list.addNode(1);
		list.addNode(2);
		list.addNode(3);
		list.addNode(4);
		list.addNode(5);
		list.addNode(6);
		list.addNode(7);
		list.addNode(8);
		list.addNode(9);
		list.addNode(10);
		list.split(3);
	}
}
相关推荐
JAVA面经实录9179 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
叼烟扛炮10 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
许彰午11 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
小程故事多_8011 小时前
[大模型面试系列] 多轮对话 Agent 设计实战(含窗口优化 + 工具调用精髓)
人工智能·面试·职场和发展
leoufung12 小时前
LeetCode 149: Max Points on a Line - 解题思路详解
算法·leetcode·职场和发展
样例过了就是过了12 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
Bat U12 小时前
JavaEE|多线程初阶(七)
java·开发语言
MegaDataFlowers14 小时前
206.反转链表
数据结构·链表
掌心向暖RPA自动化14 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭15 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器