• _funyoo_
    2019-11-20
    说说我的思考:
    方法1:在遍历链表1,看该结点是否在2中存在,若存在,即为合并。
    遍历的方法:①两个for嵌套 ②根据1建立hash表,遍历2时在1中查找

    方法2:计算两个链表的长度,谁长谁先“往前走”,待长链表未查看长度等于短链表是,两两元素比较,遍历完未出现相同时,则没有合并

    方法3:直接比较两个链表的最后一个元素,相等即合并
    展开

    作者回复: √
    方法2 👍

     9
     29
  • breezeQian
    2019-11-20
    步骤一:将长度短的链表的元素构造成哈希表,key是指针,value是节点值。
    步骤二:遍历较长链表找出合并的节点

    作者回复: √

    
     7
  •  扬帆丶启航 
    2019-11-20
    计算两个链表的长度,用长的链表减去短的链表,计算出差值,长的链表先向后移动差值的个数,然后两个链表再同时移动,判断一下个节点的地址是否相同。
     2
     6
  • 见哥哥
    2019-11-20
    思路特别清晰,但是都是点到为止呀,感觉差点啥,哈哈,可能后面的文章会具体介绍,更加详细。
    
     6
  • Geek_9c3134
    2019-11-28
    老师 你这问题我问了别人 发现只回答到了数组下标 没有人讲到内存 还说我的问题太简单了

    作者回复: 那就继续问下去~~

    Hash表数组长度不足怎么办?

    多线程并发修改Hash表怎么办?如何保证线程安全?JDK的ConcurrentHashMap是如何解决的?

    如何使Hash表中的数据分布更加均匀,减少Hash聚集?

    余数Hash算法应用于分布式缓存路由的时候有什么问题?如何解决?一致性Hash算法原理是什么?

    用你熟悉的编程语言20分钟写一个一致性Hash算法实现。

     2
     5
  • 乘坐Tornado的线程魔...
    2019-11-20
    思考题:第一步:分别遍历针对两个链表A、B(先不考虑长度差)。第二步:如果A链表先走到了末尾那么把A链表的指针指向B链表的第一个节点,继续遍历B链表;B链表的原始指针继续做遍历不变,走到末尾后,将B链表的指针指向A链表的第一个节点,继续遍历A链表。第三步:两个链表继续做遍历,如果分别指向的节点数值(地址)相同,那么这两个链表就是合并链表,这个节点就为合并的第一个节点。

    思想:通过指针的变换指向,很好滴解决的长度差的问题。消除两个链表的长度差带来的影响,
     1
     3
  • 晶晶
    2019-11-20
    是我听过的课程里面觉得最让我思路清晰的课程~所以先打卡沙发一下☺

    作者回复: 🌹

     1
     3
  • Geek_ac779f
    2019-11-27
    老师,为什么有些数据结构的内存空间不要求是连续的?都是连续的内存空间不好吗。既然连续和不连续的内存空间都可以实现这些数据结构,使用不连续的内存空间实现有什么好处呢,利用率更高吗。为什么利用率更高呢,不都是以字节为基本单位吗

    作者回复: 程序运行过程中,内存不断被申请、释放,内存的空闲空间呈碎片化,本身就是不连续的。

     1
     2
  • 郭刚
    2019-11-20
    类似Oracle中的hash join的算法

    作者回复: √

     1
     2
  • Better me
    2019-11-30
    老师,文中这段话“想在 b 和 c 之间插入一个元素 x,只需要将 b 指向 c 的指针修改为指向 x,然后将 x 的指针指向 c 就可以了”感觉反过来说更合理一些,如果按以上顺序代码实现会出现指针丢失内存泄漏的情况吧。

    作者回复: 是的,你描述的算法过程更合理。

    文中只是想表达这个插入节点,修改指针的逻辑,文中描述不作为算法过程。

     1
     1
  • 恺撒之剑
    2019-11-26
    课程中的数组示意图,长度为10的整数数组,地址从1000开始,下标为9的数组对应的起始地址应该为1036,而不是1039

    作者回复: 已改正,谢谢~

    
     1
  • 小烽
    2019-11-22
    我的思考去下:能想到的就是遍历,结合前面几位的方法,做个比较。假设长度分别为m和n,m大。
    方法一:先去遍历m 链表到m-n,然后同时遍历两个链表,比较大小,时间复杂度是O(m)

    方法二:取一条链表的值放入hash 表,另一个链表进行遍历,在没有hash 冲突的情况下,时间复杂度应该是O(m+n)

    方法三:从链表末端开始比较,时间复杂度应该也是O(m+n)

    不知道理解的对不对。
    展开
     1
     1
  • 小太白52度
    2019-11-20
    1.将两个单链表顺序颠倒,即由尾指向头;
    2.将两个新链表由头开始一一比较,直到两个元素不想等;
    3.若第一元素即不等,则两个链表不合并,否则最后一个相等元素即为合并处的元素。
     1
     1
  • Geek_60eace
    2019-11-20
    获取2个列表的所有指针,进行交集运算,抛出第一个指针就是开始合并的地方
    
     1
  • 远心
    2019-11-20
    实现了同时遍历两个单向链表的方法,欢迎拍砖:https://github.com/Huan-Rong/geektime-backend-technology-basics/blob/master/sources/2-the-time-complexity-of-hash-table/src/main/java/site/blbc/MergeDetect.java

    作者回复: 思路很赞👍

    你这里利用了LinkedList的特性,按照题意,应该无法直接得到两个链表的长度。

     1
     1
  • 幸福来敲门
    2019-11-20
    由于每个整型数据占据 4 个字节的内存空间,因此整个数组的内存空间地址是 0x1000~0x1039,根据这个,我们就可以轻易算出数组中每个数据的内存下标地址。利用这个特性,我们只要知道了数组下标,也就是数据在数组中的位置,比如下标 2,就可以计算得到这个数据在内存中的位置 0x1008。

    请问这个内存16进制地址是怎么得出来的? 0x1000~0x1039

    作者回复: 谢谢指正,应该用十进制

     2
     1
  • 丁丁历险记
    2019-11-20
    基于单向链表的特性, 为链一的地址建立hash 然后便利链表2 存在就返回,指到null 了就没有合并。

    下面写伪码实现 手机上输入的,就不整理了
    p1 = &p1_head
    while p1
    hsets[p1] =*p1
    p1 = *p1 箭头
    next

    p2 = &p2_head
    while(p2)
    if isset hsets p2 return
    p2 = *p2 箭头next
    展开

    作者回复: √

     1
     1
  • duang_duang
    2020-02-09
    思考题:
    如果合并的定义是:两个链表从某个结点开始之后一直到最后一个结点“一致”的话。那我认为将两个链表反转,然后从前往后遍历即可,这样是否合并以及开始合并的结点都很容易找出。
    
    
  • 小伟
    2020-02-02
    之前只给了伪代码,感觉不过瘾,同时也验证自己的思路是否正确,就实现了下,请老师和同学拍砖。
    https://github.com/ToddSAP/Geektime/blob/master/src/backendinterview38/course2/LinkedListMergedTest.java
    
    
  • 小伟
    2020-02-02
    同时遍历两个单链表,首先将单链表A的第一个元素对象地址放到一个散列表中,然后在遍历单链表B之前检查B的元素对象地址是否在散列表中,如果找到,则有合并,如果不在,则放入散列表,然后再遍历A,以此类推,直到某个单链表遍历结束,则结果是无合并。
    伪代码:
    while (a!=null && b!=null) {
        if (hashMap.get(a)!=null) {
            System.out.println("合并");
        } else {
            hashMap.put(a, a);
            a = a.next;
        }
        if (hashMap.get(b)!=null) {
            System.out.println("合并");
        } else {
            hashMap.put(b, b);
            b = b.next;
        }
    }
    System.out.println("无合并");
    展开
    
    
我们在线,来聊聊吧