剑指Offer之面试题22:链表中倒数第k个节点

举报
宇宙之一粟 发表于 2022/03/24 23:26:09 2022/03/24
【摘要】 面试题22:链表中倒数第k个节点每日一句: “Successful people appear to be traveling along one continual, successful road. — G. Kingsley Ward输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾节点是倒数第 1 个节点。例如,一个链表有 6...

面试题22:链表中倒数第k个节点

每日一句: “Successful people appear to be traveling along one continual, successful road. — G. Kingsley Ward

输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾节点是倒数第 1 个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

解题思路

  1. 两次遍历: 一次求节点个数 n,一次走 n-k+1 步

单链表是单向,所以只能顺着数,但是如果要找到倒数第 k 个节点,其实就是顺着数第 n - k + 1 个节点。

时间复杂度: O ( 2 n ) O(2n)

空间复杂度: O ( 1 ) O(1)

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
        cur,count = head, 0  # 这里一定要保存head的位置
        while head:
            count += 1
            head = head.next  # 第一次遍历结束后,head为空
        
        for _ in range(count - k):
            cur = cur.next    # 使用cur来重新遍历
        return cur
  1. 双指针
  • 第一个指针移动k步,第二个指针再从头开始,这个时候两个指针同时移动
  • 当第一个指针到达链表的末尾的时候,返回第二个指针

时间复杂度: O ( n ) O(n)

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:

        if head is None or k <= 0:
            return None
        
        first, second = head, head

        # first一直走到k
        for _ in range(k):
            first = first.next
        # 当first不为空,first,second一起走
        while first:
            first, second = first.next, second.next
        # first为空,second所在的位置刚好就是倒数第k个节点
        return second
  1. 递归法

递归往下走,同时增加一个count来记录递的次数,并把结果记录在res中,当到达第k个节点时,直接返回head

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:

        count = 0
        def helper(head):
            # 边界条件
            if head is None:
                return None
            nonlocal count 
            res = helper(head.next)
            count += 1
            if  count == k:
                return head
            return res
        return helper(head)

其实也不需要增加 count,直接利用 k,每一次递的过程中,对 k 进行减一,当 k==0 ,说明到达第 k 个节点,返回 head ,不然将继续进行下去,直到 head 为空。

class Solution:
    def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:

        def helper(head):
            if head is None:
                return None
            nonlocal k 
            res = helper(head.next)
            k -= 1
            if  k == 0:
                return head
            return res
        return helper(head)

这里是宇宙之一粟,下次见

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。