剑指offer 链表中倒数第k个结点 python

题目描述

输入一个链表,输出该链表中倒数第k个结点。

 

思路1:

1. 看到是单链表肯定不能反方向循环,倒数第k个节点,比如链表长度为6,倒数第三个也就是相当于正数第四个,符合6-3+1=4。

2. 所以就想到了正向遍历链表两次,但两次复杂度又太高,再考虑能不能遍历一次,进而想到了快慢指针。

3. 先判断头结点是否存在和k的大小,然后让快指针先走到第四个,也就是k的位置,然后慢指针从头节点开始走,等快指针走到最后,慢指针走道的位置就是结果,返回这个结果就可以了。

# -*- 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
        if not head or k < 1:
            return None
        
        quick = head
        slow = head
        for i in range(k):
            if quick == None:
                return 
            quick = quick.next
        
        while quick:
            quick = quick.next
            slow = slow.next
        
        return slow

 

思路2:

自然而然想到使用容器(列表、堆栈、数组等)保存链表,然后直接查询

# -*- 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
        if not head or k<1:
        return None
    
        # 使用列表保存链表结构
        stack = []
        cur = head
        while cur:
            stack.append(cur)
            cur = cur.next
        
        # 非法情况,即K大于链表长度
        if k > len(stack):
            return None
        
        return stack[-k]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值