08 周作业——数据结构与算法
有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,如下图所示的这样,也可能不合并。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。请用(伪)代码描述算法,并给出时间复杂度和空间复杂度。
题目分析:
链表合并,也就是从合并点开始到尾节点的元素全部相同。如果两链表合并了,这个合并点就是我们要寻找的节点元素x。
算法描述:
计算两个链表节点数差,假设如上图链表,链表节点差是1,链表2较长
让长链表(链表2)先遍历链表节点差位置,用 currenet2 来描述当前节点指针
开始遍历短链表(链表1),用 current2 来描述当前节点指针,并且与链表2当前节点进行比较,若值相等记录当前指针x
链表1和链表2移动到下一节点,比较当前节点,
若值相等,继续4步骤
若值不想等,重置x=nil
若 current1 或 current2 任一为空,也就是遍历完了链表
x不为空,x就是链表合并点
若x为空,说明链表不合并
伪代码:
算法的时间复杂度O(max(m, n)),也就是O(n)。
算法的空间复杂度,没有增加额外的存储空间,也就是O(1)。
版权声明: 本文为 InfoQ 作者【dao】的原创文章。
原文链接:【http://xie.infoq.cn/article/c9c12257afdac3b9743146312】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论