[算法]合并链表&删除数组重复项

合并链表

题目

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

递归解法

递归解法的思路每次找出输出的两个链表的最小值,将其next指针指向其他的链元素,再从其他的链元素中寻找最小的值,依此类推。

当两条链中的一条链为空时,返回另一条链,这样两条链表就通过每次寻找最小值的方法串在了一起。
JS代码如下

var mergeTwoLists = function(l1, l2) {
    
    if(l1===null){
        return l2;
    }
    if(l2===null){
        return l1;
    }
    if(l1.val<l2.val){
        l1.next=mergeTwoLists(l1.next,l2);
        return l1;
    }
    else{
        l2.next=mergeTwoLists(l1,l2.next);
        return l2;
    }
};

删除数组的重复项

题目

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

给定数组 nums = [1,1,2],

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。

你不需要考虑数组中超出新长度后面的元素。
示例 2:

给定 nums = [0,0,1,1,1,2,2,3,3,4],

函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。

你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

题目解释

输入的数组是引用而不是拷贝,return数组更新后的长度。

快慢指针法

这是力扣官方的解法,个人感觉神来之笔。
该解法使用了两个指针i&j:j为快指针,i为慢指针.
i初始值0,j初始值1;
j在一个for循环中向后遍历,当nums[i]与nums[j]不相等时,将i++使i继续向后遍历直到发现i与j所指向元素值相同,此时i将不继续遍历,j继续遍历到不相等的元素,将j指向的元素赋给i指向的元素。

使用例子:
输入:0012234

最后i指针指向无重复数组的最后一个元素,则长度为i+1
JS代码:

var removeDuplicates = function(nums) {
    if(nums.length===0){
        return 0;
    }
    let i=0;
    for(let j=1;j<nums.length;j++){
        if(nums[i]!==nums[j]){
            i++;
            nums[i]=nums[j];
        }
    }
    return i+1;
};
原文地址:https://www.cnblogs.com/liuju/p/12513502.html