725. Dividir Linked Lista de Peças **

725. Dividir Linked Lista de Peças **

https://leetcode.com/problems/split-linked-list-in-parts/

título Descrição

Dada uma lista (isoladamente), ligado com nó principal root, escreva uma função de dividir a lista ligada na klista “partes” consecutivos ligados.

O comprimento de cada parte deve ser tão iguais quanto possível: há duas partes devem ter um tamanho diferentes por mais do que 1. Isto pode levar a algumas partes sendo nulo.

As peças deve ser na ordem de ocorrência na lista de entrada, e partes que ocorrem mais cedo deve sempre ter um tamanho maior do que ou partes iguais que ocorre mais tarde.

Retornar uma lista de ListNode de representando as partes da lista ligadas que são formados.

Exemplos 1->2->3->4, k = 5 // 5 equal parts [ [1], [2], [3], [4], null ]

Exemplo 1:

Input:
root = [1, 2, 3], k = 5
Output: [[1],[2],[3],[],[]]
Explanation:
The input and each element of the output are ListNodes, not arrays.
For example, the input root has root.val = 1, root.next.val = 2, \root.next.next.val = 3, and root.next.next.next = null.
The first element output[0] has output[0].val = 1, output[0].next = null.
The last element output[4] is null, but it's string representation as a ListNode is [].

Exemplo 2:

Input: 
root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3
Output: [[1, 2, 3, 4], [5, 6, 7], [8, 9, 10]]
Explanation:
The input has been split into consecutive parts with size difference at most 1, and earlier parts are a larger size than the later parts.

Nota:

  • O comprimento de raiz será na gama [0, 1000].
  • Cada valor de um nó na entrada será um número inteiro na gama [0, 999].
  • kserá um número inteiro na gama [1, 50].

implementação C ++ 1

Dois anos atrás, a idéia, acho que é um louvor ah.

Pensando: Esta pergunta pode-se notar que, depois de pensar sobre o uso de uma lista de fila salvo de nós seria uma boa ideia, como o segundo exemplo, existem 10 nós, para dividi-lo em 3 partes, o tamanho eram 4, 3, 3. . apenas certifique-se o tamanho de cada pequena lista de (o código para a variável num), então cada tiro da fila num nós pode ser. Se não existirem elementos na fila, mas também determinar o número de lista vazia (por exemplo, o primeiro exemplo), desde que você pode definir uma lista vazia (como o seguinte código diretamente ptr->next = nullptr.)

class Solution {
public:
    vector<ListNode*> splitListToParts(ListNode* root, int k) {
      	// 将链表中的节点放在队列中
        queue<ListNode*> Queue;
        auto ptr = root;
        while (ptr) {
            Queue.push(ptr);
            ptr = ptr->next;
        }

        int n = Queue.size();
        int num = 0; // num 用于记录小链表的大小
        vector<ListNode*> res;
      	// 每次产生第 i 个小链表
        for (int i = 0; i < k; ++i) {
            ListNode *dummy = new ListNode(0);
            auto ptr = dummy;
          	// j 用于统计是否到达小链表的大小
            int j = 0;
          	// 对于 num 的确定是个有意思的问题, 举个例子, 比如链表大小为 n=11, 而要
          	// 分成 k=3 份, 那么为了计算第一份的大小: 11/3 = 3, 但是由于11无法整除 3,
          	// 所以令 3+1=4 为第一份的大小; 之后剩余 11-4=7 个节点未处理, 但注意, 此时
          	// 只需要求剩下的两份, 所以 7要除以 2, 即 7/2=3, 所以第二份的大小为 3+1=4,
          	// 最后还剩下 7-4=3 个节点, 由于只需要 1 份了, 所以最后一份大小为 3/1=3.
          	// (还可以用 n=10, k=3 举例子, 发现规律)
          	// 另外注意 queue<int> 是队列(而不是优先队列), 它没有 top 方法, 它是容器配接器,
          	// 底层容器是 deque.
            n -= num;
            num = n % (k - i) ? (n / (k - i) + 1) : n / (k - i);
            while (!Queue.empty() && j < num) {
                auto node = Queue.front();
                Queue.pop();
                ptr->next = node;
                ptr = ptr->next;
                ++j;
            }
            ptr->next = nullptr;
            res.push_back(dummy->next);
        }
        return res;
    }
};
Publicado 455 artigos originais · ganhou elogios 8 · vê 20000 +

Acho que você gosta

Origin blog.csdn.net/Eric_1993/article/details/104942608
Recomendado
Clasificación