Idea: El problema típico de los punteros rápidos y lentos. Hay k-2 nodos entre el puntero rápido y el puntero lento. Luego, ++ los punteros rápido y lento al mismo tiempo. Cuando el puntero rápido apunta al nodo final de la lista vinculada, el puntero lento apunta al nodo k desde la parte inferior;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {
}
};
int kthToLast(ListNode *head, int k)
{
ListNode *left = head, *right = head;
int count = 1;
while (count < k)
{
right = right->next;
count++;
}
while (right->next)
{
left = left->next;
right = right->next;
}
return left->val;
}