有两个单向链表(链表长度分别为 m,n),这两个单向链表有可能在某个元素合并,也可能不合并,如下图所示的这样。现在给定两个链表的头指针,在不修改链表的情况下,如何快速地判断这两个链表是否合并?如果合并,找到合并的元素,也就是图中的 x 元素。请用代码(或伪代码)描述算法,并给出时间复杂度。
- 计算两个链表的长度,假设M>N,将较长的链表指针前移M-N次,初始化计数器count = 0,使用变量X记录链表头指针的值
- 同时遍历两个链表,如果两个链表当前值一样,count加1,如果值不相等,count重置为0
- 当移动到下个节点时,判断count是否等于1,如果等于1,X设置为当前值
- 遍历结束后,如果count大于0,则说明可以合并,合并的元素为X,如果count等于0,这说明无法合并
伪代码:
int m = linkedNodeA.size();
int n = linkedNodeB.size();
// 判断m和n的大小,这里假设m > n
for (i = 0;i < m-n;i++)
linkedNodeA.next();
for(i =0;i < n;i++) {
nodeA = linkedNodeA.next();
nodeB = linkedNodeB.next();
if (nodeA.value == nodeB.value) {
count ++;
} else {
count = 0;
}
if (count == 1) {
X = nodeA.value;
}
}