725. 分隔链表

本文介绍了如何使用Python处理链表,通过计算每个部分的大小,实现将链表分成k个部分的算法,并提供了getPart函数来截取链表的前n个节点。关键步骤包括确定基本部分大小和余数分配,以及优化代码实现。
摘要由CSDN通过智能技术生成

题解

关键点在于k<size的时候怎么按照题目正确划分每个part的数量
size=10,k=3的时候,得到4,3,3的组合
size=14,k=3的时候,得到4,4,3,3的组合
容易得到规律,basic=size//k是每个划分区域的基础大小,然后初始化我们让每个part大小为basic,然后我们把size%k的数量,依次给前面的每个part加1,这样刚好是正确的数量

然后我们需要实现一个摘下链表前n个结点的代码

    # 取得一段链表的前n个结点,并且返回截取后的新链表
    def getPart(self,head,n):
        if not head:
            return head,head
        

        t = head
        # 尝试取出n个结点,有足够的结点可以取
        while n-1 and head.next:
            n -= 1
            head = head.next
            
        nh = head.next
        head.next = None
        # 取出的链表部分和新的首结点
        return t,nh

然后我们就可以得到代码

class Solution:
    # 取得一段链表的前n个结点,并且返回截取后的新链表
    def getPart(self,head,n):
        if not head:
            return head,head

        t = head
        # 尝试取出n个结点
        while n-1 and head.next:
            n -= 1
            head = head.next
            
        nh = head.next
        head.next = None
        # 取出的链表部分和新的首结点
        return t,nh

    def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
        # 统计size
        size = 0
        p = head
        while p:
            p = p.next
            size += 1
        
        ans = []
        # 得到每个part的大小
        basic = size//k
        ret = size%k
        num = [basic]*k
        ind = 0
        while ret:
            num[ind]+=1
            ind += 1
            ret -= 1    

        # 开始遍历取链表    
        ind = 0
        while head:
            t,head = self.getPart(head,num[ind])
            ind += 1
            ans.append(t)

        # 链表已经取完了,剩下全部填充None
        while ind<len(num):
            ans.append(None)
            ind+=1

        return ans

进一步的,可以简化取part部分的代码

class Solution:
    # 取得一段链表的前n个结点,并且返回截取后的新链表
    def getPart(self,head,n):
        if not head:
            return head,head

        t = head
        # 尝试取出n个结点
        while n-1 and head.next:
            n -= 1
            head = head.next
            
        nh = head.next
        head.next = None
        # 取出的链表部分和新的首结点
        return t,nh

    def splitListToParts(self, head: ListNode, k: int) -> List[ListNode]:
        # 统计size
        size = 0
        p = head
        while p:
            p = p.next
            size += 1
        
        ans = []
        # 得到每个part的大小
        basic = size//k
        ret = size%k
        num = [basic]*k
        for i in range(ret):
            num[i] += 1

        # 开始遍历取链表    
        ind = 0
        while head:
            t,head = self.getPart(head,num[ind])
            ind += 1
            ans.append(t)

        # 链表已经取完了,剩下全部填充None
        while ind<len(num):
            ans.append(None)
            ind+=1

        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值