要求
- 时间限制:1秒
- 空间限制:32768K
- 热度指数:541672
- 本题知识点: 链表
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思路
使用双指针,一个指针先走k步,第二个指针再和它同步后移;当第一个指针为空时,恰好第二个指针为倒数第k个位置。时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
python实现
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
pre = head
post = head
i = 0
while (post):
if (i >= k):
pre = pre.next
post = post.next
i += 1
return pre if i>=k else None
- 运行时间:33ms
- 占用内存:5640k
C++实现
/*
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(pListHead==NULL||k==0)
return NULL;
ListNode*pTail=pListHead,*pHead=pListHead;
for(int i=1;i<k;++i)
{
if(pHead->next!=NULL)
pHead=pHead->next;
else
return NULL;
}
while(pHead->next!=NULL)
{
pHead=pHead->next;
pTail=pTail->next;
}
return pTail;
}
};
运行时间:3ms
占用内存:480k
C++实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* pre = pListHead, *post = pListHead;
int i = 0;
for (i=0; post!=NULL; i++){
if (i >= k)
pre = pre->next;
post = post->next;
}
return i < k ? NULL:pre;
}
};
- 运行时间:2ms
- 占用内存:460k