前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode第一题判断链表是否有环

leetcode第一题判断链表是否有环

作者头像
Spark学习技巧
发布2018-12-28 11:21:09
7240
发布2018-12-28 11:21:09
举报
文章被收录于专栏:Spark学习技巧Spark学习技巧

为啥要刷leetcode?

数据结构表征数据存储的格式及操作数据的方式,了解这些便于我们大数据开发人员设计更好的存储,读取,计算策略。所以在java基础,大数据基础,大数据框架源码等都有一定基础之后应该去追求写出更加精致高效的代码。

最近,在整理java面试题,发现很多java底层,redis的有序set等存储结构,spark ,mr等等等我们常用的工具常见的框架都用到了数据结构与算法。所以,要想彻底搞明白底层原理,编写处时间复杂度比较低的代码,还是要去刷一下数据结构,况且数据结构貌似是bat 数据技术类必须面试的门槛,当然你做平台开发最好也会,不要以为用不到就不去学,只是你还比较菜。

再回到为啥要刷一下leetcode?

老外都在刷,大学生也在刷,自己不刷刷,大数据搞的再好有毛用,也只是底层开发。

此处,应该吐血。。。

于是乎,今天leetcode破处了,第一个题是以前没搞明白的一个题。题目如下:

Given a linked list, determine if it has a cycle in it.

就是给定一个链表如何判断其中有环。leetcode给出的命题及案例如下:

第一次是毕业的时候面试被问到这个题,一脸懵逼,这不刷题谁会?

最近细思大致思路有三:

  1. 穷举。从头遍历到尾,发现指向null,说明没环。这明显不靠谱。。。时间复杂度O(n)
  2. 第三方存储。边遍历边将指针存入hashset,并且判断当前指针是否存在于hashset,假如存在确定有环。否则无环。时间复杂度O(n)。 public boolean hasCycle(ListNode head) { Set<ListNode> nodesSeen = new HashSet<>(); while (head != null) { if (nodesSeen.contains(head)) { return true; } else { nodesSeen.add(head); } head = head.next; } return false; }
  3. 快慢指针。快指针每次走两步,慢指针走一步。假如无环,慢指针永远无法追上快指针,时间复杂度就是O(n)。假如有环,那么快指针会先掉进环里,在那打圈转,快慢指针会相遇。leetcode 上编写的java代码如下:
ListNode walker = head;
        ListNode runner = head;
        while(runner!=null&&runner.next!=null){
            walker = walker.next;
            runner = runner.next.next;
            if(walker == runner){
                return true;
            }
        }
        return false;

其实,理解思路的话代码实现是很简单。

做出来了是容易,那么可以来个四连问:

  1. 求出环入口地址。
  2. 求出来环大小。
  3. 求头节点到环入口的长度。
  4. 求出环入口到第一次相遇点的距离。

下次分析。。。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浪尖聊大数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档