每日一算法(判断)

这道题是2012年我回母校参加百度实习笔试时做的题目,当时乱七八糟就做了:

判断两个链表是否相交

问题复杂化:

如果链表有环

 

这道是一道25分的编程题~话说当时只要写出算法思想就可以了~

原题好像是

网页爬虫在抓取网页时,从指定的URL站点入口开始爬取这个站点上的所有URL  link,抓取到下一级link对应的页面后,同样对页面上的link进行抓取从而完成深度遍历。为简化问题,我们假设每个页面上至多只有一个link,如从www.baidu.com/a.html链接到www.baidu.com/b.html再链到www.baidu.com/x.html,当爬虫抓取到某个页面时,有可能再链回www.baidu.com/b.html,也有可能爬取到一个不带任何link的终极页面。当抓取到相同的URL或不包含任何link的终极页面时即完成爬取。爬虫在抓取到这些页面后建立一个单向链表,用来记录抓取到的页面,如:a.html->b.html->x.html...->NULL。 问:对于爬虫分别从www.baidu.com/x1.htmlwww.baidu.com/x2.html两个入口开始获得两个单向链表,得到这两个单向链表后,如何判断他们是否抓取到了相同的URL?(假设页面URL上百亿,存储资源有限,无法用hash方法判断是否包含相同的URL) 请先描述相应的算法,再给出相应的代码实现。(只需给出判断方法代码,无需爬虫代码)

从百度文库copy下来的~

当时幼稚的我~竟然没有发现这道题的考点~以为只是简单的对比每一个节点的地址~

现在想来好傻啊~主要是基础知识不过关吧~

没有系统的训练过用适当的数据结构来解决实际问题~

这道题有个很明显的特征:(将题意简单化)

单项链表~一个节点有且只有一个后继节点

将题目翻译成计算机语言就是:是否两个单向链表相交了~  相交的更加直白的含义就是有相同的节点~

如果两条链表有相同的节点,那么这个节点的后继节点也将会是相同,乃至到最后一个节点,知道NULL的出现都是相同

 

复杂化:

因为题意中并没有说单链表有没有环这种东西的存在~

所以如果想要拿到这道题的满分~需要考虑的环~

如果是环的话,可能就会复杂一点了~

起初我不知道怎样表达~我上网查询了一下,大牛是这样给出解释的:

首先确定一条链的环

设两个指针A,B  A指针+1递增扫描单链~B指针+2递增扫描单链~

 

刚刚吃晚饭时突然想到BUG了~扫描链表怎样算结束?

如果环是从结尾链到开头的话~那么这个链表不管从哪个节点入手,都是能回到原点的~这是循环链表

如果环是 1-2-3-4-5-6-3-4-5-6····依次循环~部分环~

似乎这样有环的链表都是无法结束的~ 也就是没有NULL的~ 那遇到这样的情况怎样才会跳出循环呢~

情况一:有环,那么可以拿1-2-3那做测试 指针A+1 B+2 也就是++和+2=~两轮之后就A和B指向的元素就相同了~

情况二:没有环,如果没有环,那么肯定有NULL的存在,那么大的限制条件就是指针+1后不能指向NULL,否则循环结束~

尼玛~这么简单的问题~ 半天都想不清楚~ 老了老了~~~~

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值