zoukankan      html  css  js  c++  java
  • 链表交叉(2012.5.6百度实习)

    题目:一个url指向的页面里面有另一个url,最终有一个url指向之前出现过的url或空,这两种情形都定义为null。这样构成一个单链表。给两条这样单链表,判断里面是否存在同样的url。url以亿级计,资源不足以hash。

    如果交叉则最后节点的url肯定是相同的!
    不管链表是怎么链接的,不管链表a和链表b在实际实现中是不是有节点交叉,还是仅仅是节点的内容交叉,两个链表的最后节点肯定相同,如果是重复的话!

    要审题认真,认真考虑题目,最好能画图,这样就不会思路偏了

    一旦出现链表的题目,就一定要考虑到环和交叉的问题;本题可以抽象为有环和无环情况下的链表交叉问题:

    情况一:两条单链表均无环
    最简单的一种情况,由于两条链表如果交叉,他们的尾节点必然相等(Y字归并),所以只需要判断他们的尾节点是否相等即可。

    情况二:两条单链表均有环
    这种情况只需要拆开一条环路(注意需要保存被设置成null的节点),然后判断另一个单链表是否仍然存在环路,如果存在,说明无交叉,反之,则有交叉的情况。

    情况三:两条单链表,一条有环路,一条无环路
    这种情况显然他们是不可能有交叉的

    附:如何判断一条单链表是否存在环路,以及找出环路的入口
    1、快慢指针:在表头设置两个指针fast与slow,fast指针与slow指针同时向前移动,但是fast每次移动2个节点,slow每次移动1个节点,若fast指向null或者fast==slow时停止,这时如果fast指向null,则说明没有环路,若fast==slow则说明有环路。
    2、找环路入口:当fast==slow时,将fast重新指向表头。slow原地不动。然后fast和slow在同时以每次一个节点的速度向前移动,当他们再次重合时,就是环路入口。证明如下:
    (1)证明fast和slow肯定会重合
    在slow和fast第一次相遇的时候,假定slow走了n步骤,环路的入口是在p步的时候经过的,那么有slow走的路径: p+c = n; c为p1和p2相交点,距离环路入口的距离;fast走的路径: p+c+k*L = 2*n; L为环路的周长,k是整数。显然,如果从p+c点开始,p1再走n步骤的话,还可以回到p+c这个点同时p2从头开始走的话,经过n步,也会达到p+c这点。
    (2)fast和slow在p+c点会重合,显然他们从环的入口点就开始重合

  • 相关阅读:
    [转载]Jupyter Notebook 的快捷键
    【转载】mysql行列转换方法总结
    【Deep Learning Nanodegree Foundation笔记】第 10 课:Sentiment Analysis with Andrew Trask
    赵铁夫讲单词·解密单词的潜规则【2016全新精华版】
    【转载】ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    [IJCAI-17 口碑商家客流量预测]
    【Deep Learning Nanodegree Foundation笔记】第 9 课:Model Evaluation and Validation
    【Deep Learning Nanodegree Foundation笔记】第 5 课:Logistic Regression
    不用动笔背单词之托福
    Jenkins--02命令行构建Job
  • 原文地址:https://www.cnblogs.com/sooner/p/3094695.html
Copyright © 2011-2022 走看看