刷题打卡

109 阅读1分钟

1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。 但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 思路:循环数组的时候,用和target减去当前循环的数算出另一个数,找出数组里是否存在这另一个数

var twoSum = function(nums, target) {
    // 第一种用数组方法查找另一个数
    for(let i = 0; i < nums.length; i++) {
        let other = target - nums[i];
        let index = nums.lastIndexOf(other);
        // 注意考虑查找到当前循环数的情况,导致一样
        if(index!=-1 && index != i) {
            return [i,index]
        }
    }
    // 第二种方法用 Map 存储已经循环过的数,在 Map 里查找是否存在另一个数
    // 这种情况不用考虑下标一样的情况,因为是在已经循环过的数里面查找另一个数
    // let map = new Map();
    // for(let i = 0; i < nums.length; i++){
    //     let other = target - nums[i];
    //     if(map.has(other)){
    //         return [map.get(other),i]
    //     }else {
    //         map.set(nums[i],i)
    //     }
    // }
};

2.合并升序链表

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

思路:迭代法:新建一个链表,比较两个链表的头部节点大小,小的加到新链表上。

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var mergeTwoLists = function(l1, l2) {
    let list = new ListNode();
    // 记一下新链表的头指针
    let pre = list;
    while(l1!=null && l2!=null){
        if(l1.val <= l2.val){
            list.next = l1;
            l1 = l1.next;
        }else {
            list.next = l2;
            l2 = l2.next;
        }
        list = list.next;
    }
    // 肯定有一个没有循环完
    list.next = (l1 == null) ? l2 : l1;
    return pre.next;
};