今天接着来练习几道双指针算法题,没有看过上一篇的可以点击这里查看
一、删除链表中的节点
题目如下:
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
现有一个链表 – head = [4,5,1,9],它可以表示为:
示例 1:
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
提示:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
解题思路:
这个题很简单,其实这个node是个引用类型,只需要把node的val变为node.next的val,然后node的next指向node.next.next,就移花接木大功告成
展示代码:
var deleteNode = function(node) {
node.val = node.next.val
node.next = node.next.next
};
热身完毕,来个复杂一点的
二、两个数组的交集II
题目如下:
题目如下:给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:
输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
解题思路:
如果两个数组是有序的,则可以使用双指针的方法得到两个数组的交集。
首先对两个数组进行排序,然后使用两个指针遍历两个数组。
初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束
var intersect = function(nums1, nums2) {
nums1 = nums1.sort((a, b) => a - b);
nums2 = nums2.sort((a, b) => a - b);
let l1 = 0;
let l2 = 0;
const nums1Len = nums1.length;
const nums2Len = nums2.length;
const ret = [];
while(l1 < nums1Len && l2 < nums2Len){
if(nums1[l1] === nums2[l2]){
ret.push(nums1[l1]);
l1++;
l2++;
}
if(nums1[l1] > nums2[l2]) l2++;
if(nums1[l1] < nums2[l2]) l1++;
}
return ret;
};