题目描述:
思考:
记录下链表总长度,算出总长度,再从前往后遍历。
class Solution:
def FindKthToTail(self , pHead: ListNode, k: int) -> ListNode:
# write code here
len = 0
dummy = pHead
while pHead:
len = len +1
pHead=pHead.next
if k>len:
return None
for i in range(len-k):
dummy = dummy.next
return dummy
看了一下答案,原来可以直接用list保存所有节点,最后返回l[:-k]
;不过这样做耗时和内存都更高。
最巧妙的是双指针的解法:采用双指针,一快一慢,快的指针比慢的指针多走k步 当快的指针走到none时,返回慢的指针即为倒数k个。
哇!太巧妙了!
假设总长度为m
,快的先走k
步,慢的再开始;那等快指针走了m-k
步走到尽头,慢指针剩余m-(m-k)=k
:
def FindKthToTail(self , pHead: ListNode, k: int) -> ListNode:
# write code here
fast = slow = pHead
for i in range(k):
if fast is None:
return None
fast=fast.next
while fast:
fast = fast.next
slow = slow.next
return slow