LeetCode 725 分隔链表

题目

给定一个头结点为 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, \root.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.前面部分的长度大于等于后面部分的长度。

思路

我们先对给定的链表求长度,然后除以k,会得到一个商和余数,商的数值代表平均分为k段之后每段有多少个节点,余数的数值代表前多少段需要多加一个节点,商和余数总共有以下几个情况:

  • (1)0商为0,余数为0。
    此时说明链表长度就是0,也不需要做什么处理,直接返回一个空数组就行。

  • (2)商为0,余数不为0。
    说明此时的链表长度是小于k的,就如例1一样,商为0,余数为3。说明平均分为5段之后,平均每段有0个节点,然后前3段需要多加一个节点,那么正好就是:[1]、[2]、[3]、[]、[]。

  • (3)商不为0,余数为0。
    说明此时正好能够将链表平均分为k段,每段的长度就是商的数值了。

  • (4)商不为0,余数不为0。
    此时说明能将链表分为k段,但是还有多余的节点。而题中规定了各个分段的长度相差不能大于1,那么我们就只能让这多出的节点再次分给每段,而且每段只能分一个。并且题中还规定了前面的长度要比后面的常,所以我们就应该按照段的顺序再给分配一个了。需要注意这里的节点顺序不能乱。

# Definition for singly-linked list.
# class ListNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution(object):
    def splitListToParts(self, root, k):
        """
        :type root: ListNode
        :type k: int
        :rtype: List[ListNode]
        """
        count = 0
        p= root
        node =[]
        while p:
            count +=1
            p =p.next
        num = count/k
        re= count %k
        for i in range(k):
            head = ListNode(0)
            p = head
            for j in range(num):
                nodes = ListNode(root.val)
                p.next = nodes
                p = p.next
                root = root.next
            if re and root:
                rnode = ListNode(root.val)
                p.next = rnode
                if root:
                    root = root.next
                re -=1
            node.append(head.next)
        return node
                
        
        

猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/85040053