算法题:链表的第一个合并节点
题目
两个单向链表,这两个链表有可能在某个元素合并(链表长度分别为m、n),如下图,也可能不合并。现在给定两个链表的头指针,在不修改链表的情况下,如何快速判断两个链表是否合并?如果合并,找到合并的元素,即图中的x元素。
解题思路
最简单的方法,也是最容易想到的方法是暴力遍历,即对于链表1的每一个节点,遍历链表2,看是否指向同一个节点。这种方法空间复杂度为1,但是时间复杂度为O(mn)。
但是,仔细观察链表。如果两个链表长度相同,那么同时移动两个链表的指针,那么会同时到达合并的节点。
那么,如果两个链表长度不相同。对于长的链表的头指针,移动两个链接的长度差,就可以得到两个长度相同的链表。
因此,算法可以分为两个阶段:
得到两个链表的长度
长的链表头指针移动一个长度差。接着,两个链表的指针同时向下移动,如果指向同一个节点,则该节点为合并的节点。
代码
定义节点
查找第一个合并的节点
测试:
运行结果:
result: x
运行结果符合预期。
版权声明: 本文为 InfoQ 作者【破晓_dawn】的原创文章。
原文链接:【http://xie.infoq.cn/article/eab2383e6fed752ba51f81004】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论