Skip to content

2. 两数相加 ​

  • 题号:2
  • 来源:LeetCode
  • 难度:中等
  • 标签:链表 数学 模拟
  • 语言:TypeScript · Java
  • 解法:2 个
  • 作者:lmliheng
  • 最近更新:2026-09-27

TypeScript ​

TypeScript · O(m+n) 时间 · O(1) 空间 · 更新于 2026-09-27

哑结点加进位逐位相加,另一版转 BigInt 不推荐

typescript
/**
 * @difficulty medium
 * @tags 链表,数学,模拟
 * @time O(m+n)
 * @space O(1)
 * @note 哑结点加进位逐位相加,另一版转 BigInt 不推荐
 */

import { ListNode } from '../JS/DataStructure/ListNode.js'


function addTwoNumbers(l1: ListNode<number> | null, l2: ListNode<number> | null): ListNode<number> | null {
    let dummy = new ListNode<number>()
    let p1 = l1
    let p2 = l2
    let p=dummy
    let carry=0
    while (p1 || p2) {
        let v1=p1?p1.val:0
        let v2=p2?p2.val:0
        let sum=v1+v2+carry
        carry=Math.floor(sum/10)
        p.next=new ListNode<number>(sum%10)
        if(p1){p1=p1.next}
        if(p2){p2=p2.next}
        p=p.next
    }
    if(carry){
        p.next=new ListNode<number>(carry)
    }
    return dummy.next
};

/**
 * 
 * @转化成数组,再转化为number相加后,最后生成链表
 * 不推荐
 */
function addTwoNumbers1(l1: ListNode<number> | null, l2: ListNode<number> | null): ListNode<number> | null {
    let nums1=[]
    let nums2=[]
    let p1=l1
    let p2=l2
    while(p1){
        nums1.push(p1.val)
        p1=p1.next
    }
     while(p2){
        nums2.push(p2.val)
        p2=p2.next
    }
    // 出现大数相加的情况
    let nums=BigInt(nums1.reverse().join(''))+BigInt(nums2.reverse().join(''))
    let arr=nums.toString().split('').reverse().map((item)=>+item)
    let dummy=new ListNode<number>()
    let p=dummy
    for(let i=0;i<arr.length;i++){
        p.next=new ListNode<number>(arr[i])
        p=p.next
    }

    return dummy.next
};

源码:ts/leetcode/2.两数相加.ts

Java ​

Java · 更新于 2026-09-27

尚未实现,先占个位置

java
/**
 * @lc 2
 * @title 两数相加
 * @difficulty medium
 * @tags 链表,数学,模拟
 * @note 尚未实现,先占个位置
 */
public class AddTwoNumbers {

    // TODO: 两条链表表示的两个非负整数相加,返回同样用链表表示的和
}

源码:Java/src/main/java/com/algorithm/leetcode/AddTwoNumbers.java


在 GitHub 上查看题目所在目录:lmliheng/algorithm