Oggi vediamo il seguente esercizio di LeetCode:

Given the head of a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x. You should preserve the original relative order of the nodes in each of the two partitions.

Possiamo risolvere questo problema separando i valori in due gruppi distinti e poi ricombinandoli, come nel codice proposto.

L’idea chiave è:

  • scorriamo la linked list una prima volta
  • per ogni nodo, separiamo i valori in due array:
  • uno per i valori minori di x
  • uno per i valori maggiori o uguali a x
  • in questo modo manteniamo anche l’ordine relativo degli elementi
  • una volta terminata la scansione, concateniamo i due array
  • infine, ricostruiamo la linked list a partire dall’array risultante

Questo approccio permette di ottenere una complessità O(n), dove n è il numero di nodi, ed è semplice da implementare. Tuttavia, utilizza memoria aggiuntiva per gli array e ricostruisce completamente la lista, mentre una soluzione più ottimale collega direttamente i nodi originali senza strutture ausiliarie.

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     val: number
 *     next: ListNode | null
 *     constructor(val?: number, next?: ListNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.next = (next===undefined ? null : next)
 *     }
 * }
 */

function partition(head: ListNode | null, x: number): ListNode | null {
    let auxHead: ListNode | null = head;
    

    let minusValues: number[] = [];
    let greatValues: number[] = [];

    auxHead = head;
    while(auxHead != null){
        if(auxHead.val < x){
            minusValues.push(auxHead.val);
        }else{
            greatValues.push(auxHead.val);
        }
        auxHead = auxHead.next;
    }
    console.log(minusValues, [x], greatValues);
    minusValues = minusValues.concat(greatValues)
    console.log(minusValues);

    return buildList(minusValues, 0);
};

function buildList(list: number[], position: number) : ListNode | null {
    if(position < list.length)
        return new ListNode(list[position], buildList(list, position+1))
    return null;
}

Se hai dubbi in merito non esitare a contattarci sui nostri social, saremo più che felici di risponderti :)