Is this an optimal implementation of merge sort?
Suspect that segmentation fault on large arrays occurs because the list1[] and list2[] ran out of space.  With the recursive calls, code is heavily using the stack space.  Use malloc() and free() for large arrays instead of VLA[]
Memory allocation could be reduced.  Via recursion, this takes > 2n (maybe 4n) memory space.  At worst it should be 2n.
Use size_t rather than int for a integer type that can handle all array indexes.

// void mergesort (int* list, int len)
void mergesort (int* list, size_t len)

Cope with 0 length.

// if(len == 1) return;
if(len &lt;= 1) return;