struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(k == 0) return nullptr; if(!pListHead || !pListHead->next) return pListHead; ListNode* p1 = pListHead; ListNode* p2 = pListHead; int i = k; while(i && p2){ p2 = p2->next; i--; } if(i>0) return nullptr; while(p2){ p1 = p1->next; p2 = p2->next; } return p1; } };
在oj测试通过,一般的做法是循环两次计数,时间复杂度O(2n),在以上代码做了优化,省去一次循环遍历链表,时间复杂度O(n).