leetcode算法

leetcode链表之分隔链表

2022-04-04  本文已影响0人  小奚有话说

725、分隔链表

题目:

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

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

返回一个由上述 k 部分组成的数组。

示例1:

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]

示例2:

输入:head = [1,2,3,4,5,6,7,8,9,10], k = 3
输出:[[1,2,3,4],[5,6,7],[8,9,10]]

思路:

先求出链表长度,然后根据链表长度进行分隔

class Solution:
    # 获取链表长度
    def getLength(self, head):
        cur = head
        count = 0
        while cur:
            cur = cur.next
            count += 1
        return count

    def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
        if not head: return [None for _ in range(k)]
        length = self.getLength(head)
        # 求出每部分长度,以及多余的数据
        part, remainder = length // k, length % k
        ans = []
        cur = prev = head
        while cur:
            # 如果还有剩余则长度+1,由于这里需要的是分隔结点的前置结点,所以进行减一
            step = (part + (1 if remainder else 0)) - 1
            while cur and step:
                cur = cur.next
                step -= 1
            # 如果还有剩余,就减一
            if remainder > 0: remainder -= 1
            # 如果当前节点不为空,说明还未到尾结点
            if cur:
                # 先记录下个结点的位置,以防指针丢失
                next = cur.next
                cur.next = None
                ans.append(prev)
                cur = prev = next
            else:
                ans.append(prev)
            # 这里每操作一次,将k减一,后续补空操作
            k -= 1
        for i in range(k):
            ans.append(None)
        return ans
上一篇下一篇

猜你喜欢

热点阅读