725. 分隔链表

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

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

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

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

题目链接: 725. 分隔链表 - 力扣(LeetCode) (leetcode-cn.com)

解题思路

  • 首先计算已给单链表的长度,才能计算出每个部分的平均长度
  • len // k 得到每个部分的平均长度,len % k 得到多余的长度
  • 对多余长度部分的处理,给前几个部分每个部分加一个节点,直到将多余的部分用完
# 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]:
        # 添加哑结点方便处理
        dumb = ListNode(0,head)
        cur = dumb
        # 记录整个单链表的长度
        length = 0
        while cur.next:
            length += 1
            cur = cur.next
        div = length // k
        mod = length % k
        # res用于返回最后的分隔结果
        res = []
        # 记录当前分配到哪一个部分,共需分配k个部分,pos的取值为0~k-1
        pos = 0
        pre = dumb
        cur = head
        while pos < k:
            res.append(cur)
            # 记录当前段落分配到了哪个节点
            temp_pos = 0
            while temp_pos < div:
                pre = pre.next
                cur = cur.next
                temp_pos += 1
            # 多分配一个节点
            if pos < mod:
                pre = pre.next
                cur = cur.next
            pos += 1
            # 下面这行代码是将单链表在pre指针这边断开,没有这行代码每一个部分都将保存到原链表直到结尾
            pre.next = None
            pre = ListNode(0,cur)
        return res

如果没有第37行代码,可以看到结果如下所示。

image

posted on 2021-09-22 11:47  墩墩儿er  阅读(54)  评论(0)    收藏  举报