22. 链表中倒数第k个节点
双指针
首先走k次确定两个指针的位置
然后一直走到链表尾为止
# Definition for singly-linked list. 单链表的构建方法
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
start = head
for i in range(1, k): # 用来控制链表长度小于k的情况
if start.next != None:
start = start.next
else:
return head
end = head
while start.next != None:
start = start.next
end = end.next
return end
06. 从尾到头打印链表
方法一:递归法
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
return self.reversePrint(head.next) + [head.val] if head else []
先递推后回溯
复杂度分析
时间复杂度 O ( N ) O(N) O(N):遍历链表,递归N次
空间复杂度 O ( N ) O(N) O(N):系统递归需要使用 O ( N ) O(N) O(N)的栈空间。
方法二:辅助栈法
复杂度分析
时间复杂度 O ( N ) O(N) O(N):入栈和出栈共使用 O ( N ) O(N) O(N)时间
空间复杂度 O ( N ) O(N) O(N):辅助栈stack和数组res共使用 O ( N ) O(N) O(N)的额外空间
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
stack = []
while head: # 判断head是否存在比判断head.next更简洁,列表初始化也更简单
stack.append(head.val)
head = head.next
return stack[::-1]