題目描述
- 題目
這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].
解題
- 1.遍歷鏈表獲取l鏈表的長度 length;
- 2.length 除以 k 得到每段鏈表的平均長度 size 和 餘數 mod,mod 的值決定了有多少個長度爲 (size + 1) 的子鏈表排在前面。
- 如:length 長度爲8 的鏈表要求被分割成3段
size = length/k,mod=length%k;(其中size=2,mod=2)
則有mod(2)個長度爲size+1(3)的鏈表排在前面
- 解題動圖
代碼實現
class Solution {
public:
vector<ListNode*> splitListToParts(ListNode* root, int k) {
vector<ListNode*> ret(k,nullptr);
ListNode* cur=root;
int length=0;
while(cur){
length++;
cur=cur->next;
}
int size=length/k,mod=length%k;
cur=root;
ListNode* pre=nullptr;
for(int i=0;i<k;i++){
ret[i]=cur;//子鏈表的頭結點存儲
int len=mod>0?(size+1):size;
for(int j=0;j<len;j++){
//往子鏈表中添加len個結點
pre=cur;
cur=cur->next;
}
if(pre) pre->next=nullptr;
//將子鏈表的尾結點的next域置爲空
if(mod) mod--;
}
return ret;
}
};