LeetCode 725 分割連結串列
阿新 • • 發佈:2020-11-13
LeetCode 725 分割連結串列
https://leetcode-cn.com/problems/split-linked-list-in-parts/
模擬
挺煩的一道題!不是難在演算法上面,而是需要考慮很多特殊情況。先模擬分割連結串列試一下吧。思路都寫在註釋裡了。
class Solution { public: vector<ListNode*> splitListToParts(ListNode* root, int k) { // 統計連結串列個數 int len = 0; for (ListNode *p = root; p != nullptr; p = p->next) ++len; // 計算每段平均多長avg_len和餘下的節點數remain // 因為要求分割後的每個連結串列長度差不能超過1,所以餘下的節點數需要分配給前remain個連結串列 int avg_len = len / k; int remain = len % k; vector<ListNode*> ans; ListNode *p = root; // 特例 - 當連結串列節點個數小於k時 if (avg_len == 0) { while (k--) { ans.push_back(p); // 當餘下節點數還沒分配完畢時,需要分割連結串列;當餘下節點數分配完畢時,p為nullptr if (remain) { ListNode *tmp = p->next; p->next = nullptr; p = tmp; --remain; } } return ans; } // 當總的連結串列節點個數大於等於k時 while (k--) { // 先數avg_len個節點 int cnt = avg_len; ans.push_back(p); while (--cnt) p = p->next; // 如果餘下節點沒有分配完畢,則繼續分配 if (remain) { p = p->next; --remain; } // 別忘了分割連結串列 ListNode *tmp = p->next; p->next = nullptr; p = tmp; } return ans; } };
看了一眼力扣官方提供的題解,程式碼行數確實比我的少,但是我好像沒怎麼看懂,還是自己寫的程式碼更好理解一點。