【算法】【leetcode】两数之和,两数相加

/*
    两数相加
    1.链表相当于从个位往上数,计算每一位的和,记录进位,创建节点。
    2.使用队列,计算好各位的值,统一创建节点(跟第一个其实差不多)
*/
function ListNode(val, next) {
    this.val = val === undefined ? 0 : val;
    this.next = next === undefined ? null : next;
}
var addTwoNumbers_2 = function (l1, l2) {
    let nums = [];
    let carry = 0;
    while (l1 != null || l2 != null || carry != 0) {
        let val1 = l1 ? l1.val : 0;
        let val2 = l2 ? l2.val : 0;
        let sum = val1 + val2 + carry;
        carry = Math.floor(sum / 10);
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
    }
    console.log(nums);
    let root = new ListNode(-1, null);
    let pointer = root;
    while (nums.length != 0) {
        pointer.next = new ListNode(nums.shift(), null);
        pointer = pointer.next;
    }
    return root.next;
};
var addTwoNumbers = function (l1, l2) {
    let tempRoot = new ListNode(0, null);
    let pointer = tempRoot;
    let carry = 0;
    while (l1 != null || l2 != null || carry != 0) {
        let val1 = l1.val || 0;
        let val2 = l2.val || 0;
        let sum = val1 + val2 + carry;
        carry = Math.floor(sum / 10);
        pointer.next = new ListNode(sum % 10, null);
        pointer = pointer.next;
        l1 = l1 ? l1.next : null;
        l2 = l2 ? l2.next : null;
    }
    return tempRoot.next;
};

let ln1 = new ListNode(3, null);
let ln2 = new ListNode(4, ln1);
let ln3 = new ListNode(2, ln2);

let ln4 = new ListNode(4, null);
let ln5 = new ListNode(6, ln4);
let ln6 = new ListNode(5, ln5);

// console.log(addTwoNumbers_2(ln3, ln6));
// console.log(addTwoNumbers(ln3, ln6));
//====================================================================================================
/*
    两数之和
    1.使用map
    2.排序,首位收缩
    3.无脑双循环
*/
var twoSum3 = function (nums, target) {
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums.length; j++) {
            if (i == j) continue;
            if (nums[i] + nums[j] == target) return [i, j];
        }
    }
};
var twoSum2 = function (nums, target) {
    nums.sort((a, b) => a - b);

    let head = 0;
    let tail = nums.length - 1;
    while (nums[head] + nums[tail] != target) {
        let val = nums[head] + nums[tail];
        if (val > target) tail -= 1;
        else head += 1;
    }
    return [head, tail];
};
var twoSum = function (nums, target) {
    let map = new Map();
    for (let i = 0; i < nums.length; i++) {
        /*
            遍历数组,数字的补值作为key,下标作为value存入。
            判断每个值是否已经存在于map中(存在则证明能与该值互补的值已经存在,对应的value就是下标)
        */
        if (map.has(nums[i])) {
            return [map.get(nums[i]), i];
        } else {
            map.set(target - nums[i], i);
        }
    }
};
// console.log(twoSum3([2, 11, 7, 15], 9));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值