725。将链表拆分为多个部分
难度:中等
主题:链接列表
给定一个单链表的头和一个整数 k,将链表分割成 k 个连续的链表部分。
每个部分的长度应尽可能相等:任何两个部分的尺寸不应相差超过一倍。这可能会导致某些部分为空。
各部分应按照输入列表中出现的顺序排列,并且较早出现的部分的大小应始终大于或等于较晚出现的部分的大小。
返回由 k 个部分组成的数组。
示例1:
示例2:
约束:
提示:
解决方案:
关键的观察是每个部分的节点数不应相差超过 1。这意味着:
让我们用 PHP 实现这个解决方案:725。将链表拆分为多个部分
<?php // Definition for singly-linked list. class ListNode { public $val = 0; public $next = null; function __construct($val = 0, $next = null) { $this->val = $val; $this->next = $next; } } /** * @param ListNode $head * @param Integer $k * @return ListNode[] */ function splitListToParts($head, $k) { ... ... ... /** * go to ./solution.php */ } // Helper function to create a linked list from an array function createLinkedList($arr) { $head = new ListNode($arr[0]); $current = $head; for ($i = 1; $i < count($arr); $i++) { $current->next = new ListNode($arr[$i]); $current = $current->next; } return $head; } // Helper function to print a linked list function printList($head) { $result = []; while ($head !== null) { $result[] = $head->val; $head = $head->next; } return $result; } // Test case 1 $head = createLinkedList([1, 2, 3]); $k = 5; $result = splitListToParts($head, $k); foreach ($result as $part) { print_r(printList($part)); } // Test case 2 $head = createLinkedList([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); $k = 3; $result = splitListToParts($head, $k); foreach ($result as $part) { print_r(printList($part)); } ?>
计算长度:我们首先遍历链表求其长度。
确定零件:
拆分列表:我们循环遍历 k 个部分并拆分列表:
处理空部分:如果节点数少于 k,则剩余部分将为 null(空)。
$head = [1,2,3]; $k = 5; Output: [[1],[2],[3],[],[]]
$head = [1,2,3,4,5,6,7,8,9,10]; $k = 3; Output: [[1,2,3,4],[5,6,7],[8,9,10]]
该解决方案有效地将链表拆分为 k 个部分,时间复杂度为 (O(n + k)),其中 n 是列表的长度。
联系链接
如果您发现本系列有帮助,请考虑在 GitHub 上给 存储库 一个星号或在您最喜欢的社交网络上分享该帖子?。您的支持对我来说意义重大!
如果您想要更多类似的有用内容,请随时关注我:
以上是。将链表拆分为多个部分的详细内容。更多信息请关注PHP中文网其他相关文章!