返回
用LeetCode 剑指Offer 22题解开算法刷题之门
前端
2023-12-10 03:05:39
算法入门,从LeetCode剑指Offer开始
作为程序员进阶必经之路,算法刷题是提升编码能力的有效途径。而LeetCode作为算法练习的殿堂,汇集了海量题目,其中剑指Offer系列更是专为中国程序员量身打造。22题——链表中倒数第k个节点,正是剑指Offer中一道经典题目,旨在考察链表操作和时间复杂度分析的基本功。
题目寻找链表中的倒数第k个节点
给定一个链表和一个整数k,请返回链表中倒数第k个节点。如果不存在倒数第k个节点,则返回null。
解题思路:直捣黄龙,从尾到头巧妙解决
要解决这道题目,关键在于巧妙地将倒数第k个节点转换为正数第n-k个节点。具体来说,我们可以采取以下两种思路:
思路一:两趟遍历,简单粗暴但效率不佳
步骤:
- 遍历链表,获取链表长度n。 时间复杂度O(n)。
- 再次遍历链表,从正数第n-k个节点开始返回。 时间复杂度O(n)。
时间复杂度: O(2n) = O(n)。
空间复杂度: O(1)。
思路二:一箭双雕,一次遍历高效解决
步骤:
- 定义两个指针p和q,p先走k步。
- 然后p和q同时遍历链表,直到p到达末尾。
- 此时q所指节点即为倒数第k个节点。
时间复杂度: O(n)。
空间复杂度: O(1)。
代码实现:用Python征服LeetCode
def get_kth_from_end(head, k):
"""
:type head: ListNode
:type k: int
:rtype: ListNode
"""
p = head
q = head
# p先走k步
for _ in range(k):
p = p.next
if not p:
return None
# p和q同时遍历链表
while p:
p = p.next
q = q.next
return q
总结:算法刷题,贵在勤学苦练
通过对LeetCode剑指Offer 22题的详细解析,相信你已经对链表操作和时间复杂度分析有了更深入的理解。算法刷题是一项长期而艰巨的任务,贵在勤学苦练,持之以恒。只要你坚持不懈,不断总结,终将成为算法高手。
LeetCode的题海浩瀚无垠,等待着你的探索。拿起键盘,继续你的刷题之旅吧!