題目描述:給定一個單向鏈結串列的頭節點和整數 k,將鏈結串列分割成 k 個連續的部分。每個部分的長度盡可能相等,且前面的部分長度不小於後面的部分。若不能均分,前幾個部分各多一個節點。若節點數少於 k,不足的部分為空。
解題思路:
n。n / k,前 n % k 個部分各多分配一個節點。時間複雜度:O(n + k) — 第一次遍歷計算長度 O(n),第二次遍歷分割 O(n),初始化結果陣列 O(k)。
空間複雜度:O(k) — 結果陣列的大小。分割操作本身是原地進行的。
1. Count total length n of linked list 2. baseLen = n / k, extra = n % k 3. For i from 0 to k-1: a. result[i] = current node b. partLen = baseLen + (1 if i < extra else 0) c. Walk partLen - 1 steps d. Cut: save next pointer, set current.next = null e. Move to saved next pointer 4. Return result
一次遍歷法:用快慢指標或預先計算來合併長度計算和分割過程。但由於必須先知道總長才能決定每部分的長度,通常仍需兩次遍歷,優化空間有限。
轉陣列再分割:先將串列轉為陣列,分割後再轉回串列。時間 O(n),空間 O(n)。邏輯簡單但浪費空間,不如原地分割高效。