https://leetcode.com/problems/split-linked-list-in-parts/
你会得到一组链结串列的头head
,还有一个数字k
请把这组链结串列拆成k
个链结串列,且要符合下列三个规则
我们可以把原本的链结切成k
段,或是做出k
个新的链结
不论如何我们都需要先知道链结的长度有多长,所以我们先全部轮过一遍找出长度N
接着,我们要找出每一段分别要放几个节点,并符合上面提到的规则
以k=3, N=10
作为例子,我们的链结长度就会分别是4,3,3
也就是每个链结长度是N//3
,但是前N%3
个链结的节点会多一个
知道长度之後我们就知道要在哪断开链结了
class Solution:
def splitListToParts(self, head: Optional[ListNode], k: int) -> List[Optional[ListNode]]:
node = head
N = 0
while node:
N += 1
node = node.next
D = N // k
M = N % k
ans = []
node1, node2 = ListNode(head), head
# node1是留来断开链结的
for i in range(M):
root = node2
for i in range(D+1):
if node2:
node1 = node2
node2 = node2.next
node1.next = None
ans.append(root)
node1, node2 = ListNode(node2), node2
for i in range(k - M):
root = node2
for i in range(D):
if node2:
node1 = node2
node2 = node2.next
node1.next = None
ans.append(root)
return ans
上面的程序码真的丑
class Solution:
def splitListToParts(self, head: Optional[ListNode], k: int) -> List[Optional[ListNode]]:
node = head
N = 0
while node:
N += 1
node = node.next
D = N // k
M = N % k
size = [D+1] * M + [D] * (k - M)
ans = []
node = head
for i in size:
root = node
for j in range(i-1):
if node:
node = node.next
ans.append(root)
if node:
node.next ,node = None, node.next
return ans
链结是一种网罗,我们要断开魂节
之前有说到 ASP.NET Core Identity 使用的是基於 Claim 的验证,其实 AS...
Introduction 在先前我们提到了 compose,并且将许多单一功能的纯函式,透过 com...
今天要讲的是 Math.random( ) 那这个是什麽呢? random 有随机的意思 所以在ja...
Odoo模组开发实战 目录 1.models介绍 2.常用的模型属性 第一章 models介绍 第二...
昨天有讲一个古老的设计:利用标头档将类别介面与实作拆开并预先编译用以隐藏实作细节但还是不够安全隐密,...