题目的解释如上,意思就是两个链表如果有数据域相同的节点的话找到第一个,如果没有的话则返回null。
以前在学校的时候没有好好学数据结构算法,一直也是断断续续,导致链表这块看起来就很头疼,其实就是C指针的内容,不熟悉的话还是很难的,其实也是复杂的,说一下感概吧,希望重新学习能完整的系统化。
言归正传,这两个链表逻辑上看图画的是相交的,实际上物理节点不一定是这样的相交的,而是有一个节点的值相等。这里有一种比较巧妙的解法,之前刷leetcode的时候也是看别人的解法才全部想明白。其实这里就是两条不相等的路径,那么在路径上有一个地方如果名字相同的话就存在公共节点,那么可以看成找两个速度一模一样的人去跑步,每次从一个节点跑到下一个节点的速度都是1,那么如果把这两个链表当成是一个链表的长度从A-->B的话,速度相同的两个人肯定会在有同一个地方的节点相遇,那么有的话是那个第一个公共节点了。
第一种:拼接字符串、跑圈
可以将两个链表理解成合成一个链表,那么如果有相同的节点就是有第一个公共子节点,和上面跑圈的说法是一个道理。
实现代码如下:
第二种:哈希和集合
先把一个链表的元素全部存进hash里面,如果第二个链表里面有该节点,说明存在相同的节点,因为他们的地址相同,代码如下。
引用我们教官的创建公共链表节点方法,
经过测试代码:
得出的结果如下:
其实判断的是这个节点的地址是否相同,也就是是否同一个节点,这一点其实从创建这个链表的代码就可以看出其实两个链表公共节点前的尾部是指向同一个节点的,也就能够理解用hash去判断的本质了,但是这个方法leetcode上面运行的时间效率是比第一个方法要低不少的。
第三种:双指针和差值
该方法的思路就是把两个不一样链表长度的差值计算出来,然后让长的链表先走完这个差值,再判断长度相等的部分有没有公共的节点。