• LeetCode-剑指offer22:链表中倒数第k个节点


    题目描述:

    输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

    例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

    示例:

    给定一个链表: 1->2->3->4->5, 和 k = 2.

    返回链表 4->5.

    解决方案:[ 可行,但是提交超时 ]

    我的第一个想法就是先翻转链表,把链表1->2->3->4->5变成5->4->3->2->1,然后遍历到k,得到5->4,然后再将5->4翻转成4->5,得出结果,但是很遗憾,提交结果是时间超时。所以这个方案舍弃。

    伪代码如下:

     func getKthFromEnd(_ head: ListNode?, _ k: Int) -> ListNode? {
            let head = reverse()
            while k > 0 {
                head = head.next
                k -= 1
            }
            return reverse()
        }

    然后看了下别人的方案,发现一个非常巧妙的解法。

    双指针法,定义两个指针,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动,从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针到达链表的尾结点时,第二个指针正好指向倒数第K个节点

    代码如下:

      func getKthFromEnd(_ head: ListNode?, _ k: Int) -> ListNode? {
            if head == nil || k == 0 { return nil }
            var count = k
            var first = head
            var second = head
            
            while count > 1 {
                //这里判断下 如果first.next 为空,说明,链表的长度不足k
                guard let node = first?.next else { return nil }
                first = node
                count -= 1
            }
            
            while first?.next != nil {
                second = second?.next
                first = first?.next
            }
            return second
        }
    }

    今天分享的内容短小精悍,是不是很简单,但是很巧妙。自己想,可能一会儿很难想到,所以平时多刷刷就行了。

    欢迎关注【无量测试之道】公众号,回复【领取资源】
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、
    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:


    添加关注,让我们一起共同成长!

  • 相关阅读:
    如何设计一个秒杀系统
    Leetcode题目437:路径总和III(递归-简单)
    Leetcode题目461:汉明距离(位运算-简单)
    Leetcode题目617:合并二叉树(递归-简单)
    分布式锁
    分布式搜索引擎
    数据库
    Java知识体系思维导图
    wav文件头详解,看懂wav文件
    推荐一个最近在学习的AI算法工程师手册,侵删
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/15157487.html
Copyright © 2020-2023  润新知