javascript剑指offer17
时间: 2023-08-14 20:05:49 浏览: 175
题目描述:
输入两个链表,找出它们的第一个公共节点。
解题思路:
这道题有一个比较巧妙的解法,可以通过双指针的方式来解决,具体步骤如下:
1. 定义两个指针,分别指向两个链表的头节点。
2. 分别遍历两个链表,获取它们的长度。
3. 让较长的链表的指针先走(走的步数为两个链表的长度差),然后同时遍历两个链表,比较节点是否相同。
4. 如果找到了相同的节点,就返回这个节点;否则返回 null。
时间复杂度为 O(m+n),空间复杂度为O(1)。
参考代码如下:
```javascript
function findFirstCommonNode(head1, head2) {
if (!head1 || !head2) {
return null;
}
let p1 = head1, p2 = head2, len1 = 0, len2 = 0;
while (p1) {
len1++;
p1 = p1.next;
}
while (p2) {
len2++;
p2 = p2.next;
}
p1 = head1, p2 = head2;
if (len1 > len2) {
for (let i = 0; i < len1 - len2; i++) {
p1 = p1.next;
}
} else {
for (let i = 0; i < len2 - len1; i++) {
p2 = p2.next;
}
}
while (p1 && p2) {
if (p1 === p2) {
return p1;
}
p1 = p1.next;
p2 = p2.next;
}
return null;
}
```
这是一种比较简单有效的解法,可以有效避免暴力枚举的复杂度问题。
阅读全文