Dato un elenco collegato di numeri interi in ordine casuale, suddividerlo in due nuovi elenchi collegati in modo tale che la differenza nella somma degli elementi di ciascuna lista sia massima e la lunghezza degli elenchi differisce di non più di 1 (nel caso in cui l'elenco originale abbia un numero dispari di elementi). Non posso presumere che i numeri nella lista siano unici.dividere un elenco collegato in 2 liste pari contenenti i numeri più piccoli e più grandi
L'algoritmo ho pensato è stato quello di fare un merge sort sulla lista collegata originale (O (n & middot; log n) tempo, O (n) spazio) e quindi utilizzare una funzione ricorsiva per raggiungere a piedi la fine della lista per determinare la sua lunghezza, facendo la divisione mentre la funzione ricorsiva si srotola. La funzione ricorsiva è O (n) e lo spazio O (n).
Questa è la soluzione ottimale? Posso pubblicare il mio codice se qualcuno pensa che sia rilevante.
Se tuo l'implementazione della lista collegata mantiene una proprietà di dimensione, quindi devi solo camminare a metà dell'elenco per tagliarlo a metà. (Potrebbe voler dare un'occhiata a http://codereview.stackexchange.com!) – Jeremy
@Jeremy Heiler: Nessuna proprietà di dimensione, solo una semplice lista di link semplice di jane, in realtà niente più di un mucchio di nodi collegati tra loro. –
A meno che l'esame non richieda di implementare l'ordinamento, è possibile utilizzare anche Collections.sort per eseguire l'ordinamento. – karakuricoder