A lista ligada só vai gastar menos memória se eu não usar todo o espaço alocado do array.
Por exemplo, se eu declaro um array com 1000 elementos e só uso 10, claro que gasta mais memória que uma lista com apenas 10 elementos. Mas lembre-se que em uma lista, cada elemento tem também um ponteiro para o próximo.
Ou seja, se a lista tiver 500 elementos, os primeiros 499 elementos precisam ter um ponteiro para o próximo. Isso quer dizer que ela está usando 999 valores, praticamente o mesmo que o array.
Uma comparação mais justa é se o array está usando todos os 1000 espaços e a lista tem 1000 elementos. Aí o array gasta menos memória que a lista, pois esta precisa dos 1000 elementos, e os primeiros 999 também tem ponteiros para o próximo elemento.
No caso de precisar aumentar o array, claro que vc vai precisar alocar espaço novo e copiar tudo pra lá. Mas o espaço anterior pode ser liberado e reusado. Então não é que o array "gasta mais memória", na verdade o problema é que realocar dá mais trabalho, mas uma vez feito, na média vai gastar menos que a lista.
O array pode desperdiçar memória se vc não usa todo o espaço alocado. Se usar tudo, gasta menos que uma lista do mesmo tamanho.
O ponto é: se o programa vai ter poucas inserções ou vc já sabe que o tamanho é fixo, compensa usar o array. Se for o contrário, a lista passa a ser mais interessante.
O mesmo vale para a performance. A lista é mais rápida para inserir e remover elementos no meio (no array precisa "empurrar" todos pro lado, na lista vc só troca uns ponteiros).
Se vc tem muitas inserções ou remoções, a lista compensa mais. Se a busca é mais importante, o array passa a ser uma opção melhor.
De forma mais geral, toda estrutura de dados tem prós e contras, e cabe a vc avaliar qual atende melhor ao seu cenário.