给定两个单链表,统计这两个单链表中有几个节点的值是相同的,输出这些相同的值。用js实现
时间: 2024-02-10 12:10:55 浏览: 32
好的,下面是用 JavaScript 实现的代码:
```javascript
class ListNode {
constructor(val, next = null) {
this.val = val;
this.next = next;
}
}
function getIntersection(headA, headB) {
const set = new Set();
let currA = headA,
currB = headB;
while (currA) {
set.add(currA.val);
currA = currA.next;
}
const res = [];
while (currB) {
if (set.has(currB.val)) {
res.push(currB.val);
}
currB = currB.next;
}
return res;
}
```
这个算法的思路比较简单,就是使用哈希表来记录第一个链表中的结点值,然后遍历第二个链表,如果当前结点的值在哈希表中出现过,则把它加入到结果数组中。
具体实现过程如下:
1. 创建一个哈希表 `set`,遍历第一个链表,把链表中的结点值添加到哈希表中。
2. 遍历第二个链表,判断当前结点的值是否在哈希表中出现过,如果出现过,则把它加入到结果数组 `res` 中。
3. 返回结果数组 `res`。
希望这个算法可以帮助到您。
相关问题
给定两个单链表,编写算法找出两个链表的公共结点
好的,以下是用中文回答您的问题:
假设我们有两个单链表,它们的节点数不一定相等,现在需要找出它们的公共结点。
为了找出两个单链表的公共结点,我们可以使用以下算法:
1. 先遍历第一个链表,记录下链表的长度为len1。
2. 再遍历第二个链表,记录下链表的长度为len2。
3. 如果len1 > len2,则让第一个链表的指针p1先走len1-len2步。
如果len2 > len1,则让第二个链表的指针p2先走len2-len1步。
4. 然后同时遍历第一个链表和第二个链表,比较它们的每个结点是否相同。
如果相同,就找到了它们的公共结点。
如果不相同,就继续遍历下一个结点,直到找到公共结点或者到达链表的末尾。
这个算法的时间复杂度是O(len1+len2),其中len1和len2分别是两个链表的长度。
给定一个单链表l,请编写程序输出l中间节点保存的数据
首先,需要遍历整个单链表,统计出单链表的长度。然后找到单链表的中间节点位置,如果单链表长度为偶数,则中间节点有两个,输出其中较大的一个即可。
找到中间节点位置的方法有多种,可以使用快慢指针,快指针每次移动两个节点,慢指针每次移动一个节点,当快指针到达链表末尾时,慢指针指向的就是中间节点。
另外,如果单链表长度较小,可以直接使用数组将所有节点存储下来,然后输出中间节点即可。
具体代码实现如下:
```
# 定义单链表节点类
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def find_mid_node(head: ListNode) -> int:
# 先遍历整个单链表,统计长度
length = 0
curr = head
while curr:
length += 1
curr = curr.next
mid = length // 2 # 计算中间节点位置
# 使用快慢指针找中间节点
slow, fast = head, head
for i in range(mid):
fast = fast.next
while fast.next:
slow = slow.next
fast = fast.next
if length % 2 == 0:
return max(slow.val, slow.next.val)
else:
return slow.val
```
此外,还需要注意单链表为空或只有一个节点的情况,这时中间节点就是链表的唯一节点。