zoukankan      html  css  js  c++  java
  • LeetCode 725. 分隔链表

    725. 分隔链表

    Difficulty: 中等

    给定一个头结点为 root 的链表, 编写一个函数以将链表分隔为 k 个连续的部分。

    每部分的长度应该尽可能的相等: 任意两部分的长度差距不能超过 1,也就是说可能有些部分为 null。

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

    返回一个符合上述规则的链表的列表。

    举例: 1->2->3->4, k = 5 // 5 结果 [ [1], [2], [3], [4], null ]

    示例 1:

    输入: 
    root = [1, 2, 3], k = 5
    输出: [[1],[2],[3],[],[]]
    解释:
    输入输出各部分都应该是链表,而不是数组。
    例如, 输入的结点 root 的 val= 1, root.next.val = 2, 
    oot.next.next.val = 3, 且 root.next.next.next = null。
    第一个输出 output[0] 是 output[0].val = 1, output[0].next = null。
    最后一个元素 output[4] 为 null, 它代表了最后一个部分为空链表。
    

    示例 2:

    输入: 
    root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
    输出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
    解释:
    输入被分成了几个连续的部分,并且每部分的长度相差不超过1.前面部分的长度大于等于后面部分的长度。
    

    提示:

    • root 的长度范围: [0, 1000].
    • 输入的每个节点的大小范围:[0, 999].
    • k 的取值范围: [1, 50].

    Solution

    两步走:

    1. 求得链表的长度length
    2. 计算k个部分中每个部分的长度int(length / k),前length%k个在此基础上长度加1
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    ​
    class Solution:
        def splitListToParts(self, root: ListNode, k: int) -> List[ListNode]:
            # 链表的长度
            tmp = root
            length = 0
            while tmp:
                tmp = tmp.next
                length += 1
            
            # 列表的前j个在i的基础上加一
            i, j = int(length / k), length % k
            res = []
            if i == 0:
                for _ in range(k):
                    if root:
                        res.append(ListNode(root.val))
                        root = root.next
                    else:
                        res.append(None)
            else:
                for l in range(1, k+1):
                    # 前 k 个的子元素长度为i+1
                    dummy = pre = ListNode(-1)
                    if l <= j:
                        for _ in range(i+1):
                            pre.next = root
                            root = root.next
                            pre = pre.next
                    else:
                        for _ in range(i):
                            pre.next = root
                            root = root.next
                            pre = pre.next
                    pre.next = None
                    res.append(dummy.next)
            return res
    
  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14219801.html
Copyright © 2011-2022 走看看