C (gcc) with -m32 and -mllm, 94 8888 87 bytes
- -6 thanks to ceilingcat
32-bit mode used to make bit-twiddling of pointers easier.
As C doesn't have any list primitive, I implemented a tagged value list (lists stored as an item have the least significant bit set.) The function simply gets the total length of the current list and checks to see if any sublist has a longer length.
f(l,m,i)int*l,*m;{for(m=l,i=0;l;l=l[1])i++;for(;m;m=m[1])*m&1?i=fmax(f(*m&~1*m^1),i):0;l=i;} Ungolfed:
f(l,m,i)int*l,*m;{ for(m=l,i=0;l;l=l[1]) i++; // Get length of current list for(;m;m=m[1]) *m&1? // Is this a sublist? i=fmax(f(*m&~1*m^1),i): // Is the sublist longer? 0; l=i; }