key: two pointers, one runs fast than the other n+1 steps
Runtime: 4 ms / beats 37.25%
Reference:discuss
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *s, *e;
s = e = head;
int i;
for(i = 0; i < n+1 && e != NULL; i++)
{
e = e->next;
}
ListNode *temp;
if(i < n+1)
{
temp = head;
head = head->next;
free(temp);
return head;
}
while(e != NULL)
{
s = s->next;
e = e->next;
}
temp = s->next;
s->next = s->next->next;//ne
free(temp);
return head;
}
};
Update: add a header to reduce complicate ‘if’ cases later
Reference:Editorial Solution
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *s, *e, header(0);
header.next = head;
s = e = &header;
for(int i = 0; i < n+1; i++)
{
e = e->next;
}
while(e != NULL)
{
e = e->next;
s = s->next;
}
ListNode *temp;
temp = s->next;
s->next = s->next->next;
free(temp);
return header.next;
}
};