首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

您真的懂单链表吗

2012-08-22 
你真的懂单链表吗首先,上一道开胃菜:怎么判断两个单链表是否相交?我们假设两个单链表分别是A(有m个结点)和

你真的懂单链表吗




      首先,上一道开胃菜:怎么判断两个单链表是否相交?
      我们假设两个单链表分别是A(有m个结点)和B(有n个结点),当然,最容易想到的肯定是两层循环,遍历A中的元素,然后分别与B中的元素进行比较,但是这样做的时间复杂度达到了O(m*n),那么有没有更简单的办法呢?肯定有!
      我们来看看单链表的性质:每个结点只通过一个指针指向后继结点。那么是不是意味着两个单链表如若相交,它们就只能是Y形相交,而不可能是X形相交,亦即从第一个相同的结点开始,后面的结点全部一样。如果能想到这个,后面的就简单明了了:只要A链表和B链表的最后一个结点值相等,则证明A链表和B链表相交。该算法的时间复杂度也下降到O(m+n)。
      我们进一步来思考:怎么找到第一个相交的元素呢?
      这里就当然不能像刚才那样,但是出发点还是一样,我们同样可以保证只要两次遍历。我们假设m > n,那么如果我们将两个链表的末尾对齐,是不是从最后一个往前看(当然单链表不能往前遍历,我们先这样看)的时候,A链表会比B链表多m-n个元素,而A链表中的前m-n个元素可以忽略,直接从第m-n个元素开始和B链表一起向前遍历,比较A链表上第m-n+i个元素和B链表第i个元素(i<n)即可。第一个相同的元素即为所求。参看下图可以帮助理解:



      实现代码如下:

       13 楼    暗夜魅影    2012-04-22              表示你怎么不把单链表就地逆置补充上啊    14 楼    luliangy    2012-05-09              哥哥,单链表反转好像原地逆置考的比较多一些。 

热点排行