LeetCode 725. Split Linked List in Parts(分隔链表)

题意:将原链表分隔成k个链表,要求所有分隔的链表长度差异至多为1,且前面的链表长度必须大于等于后面的链表长度。

分析:

(1)首先计算链表总长len

(2)根据len得到分隔的链表长度要么为size,要么为size+1,由于前面的链表长度必须大于等于后面的链表长度,因此,前mod个分隔的链表长度为size+1,其他分隔的链表长度为size

(3) vector<ListNode*> ans(k)----k个ListNode*,每个元素都初始化为NULL:对于原链表为NULL,或是len<k的情况很友好

(4)注意:每个分隔的链表末尾指向NULL

(5)要被这句if(mod-- > 0)坑死了,如果写成if(mod)的话,mod为负的情况也会进if

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
        ListNode *tmp = root;
        int len = 0;
        while(tmp){
            tmp = tmp -> next;
            ++len;
        }
        int splitlen = len / k;
        int mod = len % k;
        vector<ListNode*> ans(k);
        for(int i = 0; i < k && root; ++i){
            int tmplen = splitlen;
            if(mod-- > 0)  ++tmplen;
            ans[i] = root;
            for(int j = 0; j < tmplen - 1; ++j){
                root = root -> next;
            }
            tmp = root -> next;
            root -> next = NULL;
            root = tmp;
        }
        return ans;
    }
};

  

posted @ 2020-02-27 23:31  Somnuspoppy  阅读(129)  评论(0编辑  收藏  举报