leetcode算法練習【725】分隔鏈表

所有題目源代碼:Git地址

題目

給定一個頭結點爲 root 的鏈表, 編寫一個函數以將鏈表分隔爲 k 個連續的部分。

每部分的長度應該儘可能的相等: 任意兩部分的長度差距不能超過 1,也就是說可能有些部分爲 null。

這k個部分應該按照在鏈表中出現的順序進行輸出,並且排在前面的部分的長度應該大於或等於後面的長度。

返回一個符合上述規則的鏈表的列表。

舉例: 1->2->3->4, k = 5 // 5 結果 [ [1], [2], [3], [4], null ]

示例 1:

輸入: 
root = [1, 2, 3], k = 5
輸出: [[1],[2],[3],[],[]]
解釋:
輸入輸出各部分都應該是鏈表,而不是數組。
例如, 輸入的結點 root 的 val= 1, root.next.val = 2, \root.next.next.val = 3, 且 root.next.next.next = null。
第一個輸出 output[0] 是 output[0].val = 1, output[0].next = null。
最後一個元素 output[4] 爲 null, 它代表了最後一個部分爲空鏈表。
示例 2:

輸入: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
輸出: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
解釋:
輸入被分成了幾個連續的部分,並且每部分的長度相差不超過1.前面部分的長度大於等於後面部分的長度。
 

提示:

root 的長度範圍: [0, 1000].
輸入的每個節點的大小範圍:[0, 999].
k 的取值範圍: [1, 50].

方案:單鏈表

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
        public ListNode[] splitListToParts(ListNode root, int k) {
            int index = 0;
            ListNode cur = root;
            while (cur != null) {
                index++;
                cur = cur.next;
            }
            int len = index / k;
            int remain = index % k;
            ListNode[] lists = new ListNode[k];
            cur = root;
            int tmp = 1;
            int i = 0;
            lists[0] = root;
            ListNode tmpNode;
            while (cur != null) {
                if (tmp == (len + (remain - 1 >= i ? 1 : 0))) {
                    tmpNode = cur;
                    cur = cur.next;
                    tmpNode.next = null;
                    tmp = 1;
                    i++;
                    if (i<k)    lists[i] = cur;
                } else {
                    tmp++;
                    cur = cur.next;
                }
            }
            return lists;
        }
    }
複雜度計算
  • 時間複雜度:O(n),兩遍
  • 空間複雜度:O(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章