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);
	}
}
相关推荐
醉城夜风~15 分钟前
[数据结构]双链表详解
数据结构
01_21 分钟前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
菜鸟一枚在这35 分钟前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
gyeolhada1 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~1 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
菜鸟一枚在这1 小时前
深入理解设计模式之代理模式
java·设计模式·代理模式
小天努力学java1 小时前
【面试系列】Java开发--AI常见面试题
java·人工智能·面试
river661 小时前
java开发——为什么要使用动态代理?
java
Zayn~2 小时前
JVM系列--虚拟机类加载机制
java
m0_748248022 小时前
Redis使用手册
java