链表交叉

来源:互联网 发布:淘宝开店教学大纲 编辑:程序博客网 时间:2024/06/06 04:01
一个url指向的页面里面有另一个url,最终有一个url指向之前出现过的url或空,这两种情形都定义为null。这样构成一个单链表。给两条这样单链表,判断里面是否存在同样的url。url以亿级计,资源不足以hash。
如果交叉则最后节点的url肯定是相同的!!
不管链表是怎么链接的,不管链表a和链表b在实际实现中是不是有节点交叉,还是仅仅是节点的内容交叉,两个链表的最后节点url肯定相同,如果是重复的话!动手画图,很快就明白了!一旦出现链表的题目,就一定要考虑到环和交叉的问题;不过最后的结点这里定义为null,好坑啊,这样就不能单纯判断最后一个结点了。。。所以就变成有环和无环情况下的链表交叉问题: 情况一:两条单链表均无环     最简单的一种情况,由于两条链表如果交叉,他们的尾节点必然相等(Y字归并),所以只需要判断他们的尾节点是否相等即可。 情况二:两条单链表均有环    这种情况只需要拆开一条环路(注意需要保存被设置成null的节点),然后判断另一个单链表是否仍然存在环路,如果存在环路,说明无交叉(如果交叉最后的结点一样,所以拆开一个表的环,就相当于两个链表的环都拆开了),反之不存在环路,则说明有交叉的情况。 情况三:两条单链表,一条有环路,一条无环路    这种情况显然他们是不可能有交叉的。。。 如何判断一条单链表是否存在环路,以及找出环路的入口快慢指针:在表头设置两个指针fast与slow,fast指针与slow指针同时向前移动,但是fast每次移动2个节点,slow每次移动1个节点,若fast指向null或者fast==slow时停止,这时如果fast指向null,则说明没有环路,若fast==slow则说明有环路。找环路入口:当fast==slow时,将fast重新指向表头,slow原地不动。然后fast和slow在同时以每次一个节点的速度向前移动,当他们再次重合时,就是环路入口。证明如下:fast和slow肯定会重合在slow和fast第一次相遇的时候,假定slow走了n步,环路的入口相距起点是p步, c为fast和slow相交点,距离环路入口的距离c(区别路程),那么有slow走的路程: p+c=n;fast走的路程: p+c+kl = 2n;   l为环路的周长,k是整数。则两式相减 n=kl,2n=2kl,肯定会相遇的啊。
根据上式 p=n-c=kl-c,显然,如果从p+c点开始,slow再走n-c步的话,可以回到p点,同时fast从头开始走的话,经过p步,也会达到p点。fast和slow在p点会重合,显然他们从环的入口点就开始重合。
至于上亿的url如何处理参考http://blog.csdn.net/liangbopirates/article/details/8741368
转载请注明出处


原创粉丝点击