Python解Leetcode: 725. Split Linked List in Parts

  • 题目描述:给定一个单链表,写一个函数把它分成k个单链表。分割成的k个单链表中,两两之间长度差不超过1,允许为空。分成的k个链表中,顺序要和原先的保持一致,比如说每个单链表有3个结点,则第一个单链表的结点为输入链表的前三个结点,依次类推。

  • 思路:

  1. 第一次遍历单链表,求出链表的长度length;
  2. 求出平均分成的k个链表中,每个的结点avg,以及还多余的结点rem;
  3. 第二次遍历输入链表,如果达到avg,且rem存在值,则把本次遍历的结果赋值给结果数组;
# 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]
        """
        ret = [None] * k  # 结果
        length, move = 0, root
        while move:
            length += 1
            move = move.next
        avg, rem = length / k, length % k
        move, indexs = root, 0  # 结果数组索引
        while move:
            tmp = move
            pre = ListNode(0)  # 当前结点的前一个结点
            pre.next = move
            num = 0
            while num < avg:  # 平均分给每个k的结点数目
                pre, move = pre.next, move.next
                num += 1
            if rem:  # 平分之后还应该分给前rem个链表每个一个结点
                pre, move = pre.next, move.next
                rem -= 1
            pre.next = None
            ret[indexs] = tmp
            indexs += 1
        return ret
posted @ 2017-12-01 22:03  潇湘旧友  阅读(677)  评论(0编辑  收藏  举报