分隔链表
题目描述:
给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。
每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。
这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。
返回一个由上述 k 部分组成的数组。
示例 :
输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。
提示:
- 链表中节点的数目在范围 [0, 1000]
- 0 <= Node.val <= 1000
- 1 <= k <= 50
解法
正常模拟过程即可。
代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
p = head
len_list = 0
while p:
p = p.next
len_list += 1
m, n = len_list // k, len_list % k
res = [None for _ in range(k)]
p = head
for i in range(k):
if not p:
break
res[i] = p
size = m + 1 if i < n else m
for _ in range(size - 1):
p = p.next
q = p
p = p.next
q.next = None
return res
测试结果
执行用时:36 ms, 在所有 Python3 提交中击败了 76.36% 的用户
内存消耗:15.4 MB, 在所有 Python3 提交中击败了 52.00% 的用户
说明
算法题来源:力扣(LeetCode)