力扣--两数之和

类似于数组的高精度加法,但是需要知道连接链表

优化前:

/**
 * 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 addTwoNumbers = function (l1, l2) {
  let ans = new ListNode();
  let head = null;
  let t = 0;
  while (l1 && l2) {
    let value = (l1.val + l2.val + t) % 10;
    if (!head) {
      ans.val = value;
      head = ans;
    } else {
      let node = new ListNode();
      node.val = value;
      head.next = node;
      head = node;
    }

    t = parseInt((l1.val + l2.val + t) / 10);
    l1 = l1.next;
    l2 = l2.next;
  }
  while (l1 !== null) {
    let node = new ListNode();
    node.val = (l1.val + t) % 10;
    head.next = node;
    head = node;
    t = parseInt((l1.val + t) / 10);

    l1 = l1.next;
  }
  while (l2 !== null) {
    let node = new ListNode();
    node.val = (l2.val + t) % 10;
    head.next = node;
    head = node;
    t = parseInt((l2.val + t) / 10);

    l2 = l2.next;
  }
  if (t) {
    let node = new ListNode();
    node.val = 1;
    head.next = node;
  }
  return ans;
};

其实可以写在一个while循环里面,看题解优化后:还比上面的慢了1ms,但是代码风格更好

/**
 * 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 addTwoNumbers = function (l1, l2) {
  let head = null;
  let tail = null;
  let t = 0;

  while (l1 || l2) {
    const a = l1 ? l1.val : 0;
    const b = l2 ? l2.val : 0;
    let value = (a + b + t) % 10;
    let node = new ListNode();
    if (!head) {
      head = tail = node;
      head.val = value;
    } else {
      node.val = value;
      tail.next = node;
      tail = node;
    }
    t = parseInt((a + b + t) / 10);
    if (l1) {
      l1 = l1.next;
    }
    if (l2) {
      l2 = l2.next;
    }
  }
  if (t) {
    let node = new ListNode(t);
    tail.next = node;
  }
  return head;
};

力扣两数之和问题有多种解决方案,以下为你介绍不同语言和方法的实现: #### JavaScript 哈希表解法 ```javascript function twoSum(nums, target) { const numMap = new Map(); for (let i = 0; i < nums.length; i++) { const complement = target - nums[i]; if (numMap.has(complement)) { return [numMap.get(complement), i]; } numMap.set(nums[i], i); } return []; } const nums = [2, 7, 11, 15]; const target = 9; console.log(twoSum(nums, target)); ``` 该方法通过创建一个 `Map` 来存储数字及其索引,一次遍历数组,计算差值 `complement`,如果 `Map` 中存在该差值对应的键,则返回两个索引,否则将当前数字及其索引存入 `Map` 中。若未找到匹配项,返回空数组[^1]。 #### C 语言暴力解法 ```c /** * Note: The returned array must be malloced, assume caller calls free(). */ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int i,j; int *a=(int*)malloc(sizeof(int)*2); for(i=0;i<numbersSize;i++) { for(j=i+1;j<numbersSize;j++) { if(numbers[i]+numbers[j]==target) { *returnSize=2; a[0]=i+1; a[1]=j+1; return a; } } } *returnSize=0; return 0; } ``` 此方法使用两层循环遍历数组,不重复地检查每对元素的和是否等于目标值。若找到满足条件的元素,则将其索引存入新数组并返回;若未找到,返回 `0` 并将 `returnSize` 设为 `0`[^4]。 #### C++ 双指针法(适用于有序数组) 对于一个下标从 1 开始的已按非递减顺序排列的整数数组 `numbers`,可以使用双指针法找出满足相加之和等于目标数 `target` 的两个数。双指针分别指向数组的首尾,根据两数之和与目标值的大小关系移动指针,直到找到满足条件的两个数[^3]。 ```cpp #include <vector> using namespace std; class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { int left = 0, right = numbers.size() - 1; while (left < right) { int sum = numbers[left] + numbers[right]; if (sum == target) { return {left + 1, right + 1}; } else if (sum < target) { left++; } else { right--; } } return {}; } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值