2.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.


方法一:暴力解法--链表长度过长时会发生溢出

  • 将两个链表转为对应的数字
  • 对这两个数相加 得到新的数字
  • 将该书转化成链表并返回
public static ListNode addTwoNumbers(ListNode l1,ListNode l2){
    long num1=getNumber(l1);
    long num2=getNumber(l2);
    long sum=num2+num1;
    return convertToLinkedList(sum);
}
public static long getNumber(ListNode node){
    long num=0;
    long weight=1;//权重
    while(node!=null){
        num+=(long) node.val*weight;
        node=node.next;
        weight*=10;
    }
    return num;
}
public static ListNode convertToLinkedList(long num){
    if(num==0)
        return new  ListNode(0);
    ListNode dummy=new ListNode(0);//初始化一个哑巴节点
    ListNode current=dummy;
    while(num>0){
        int digit=(int) num%10;
        num/=10;
        current.next=new ListNode(digit);
        current=current.next;
    }
    return dummy.next;
}

方法二:逐位相加法

  • 从两个链表的头节点开始,逐位相加
  • 用一个变量 carry 来记录进位
  • 将每一位的和加上进位%10,得到当前位的值
  • 将每一位的和加上进位/10,得到进位的值
  • 继续遍历链表,直到两个链表都遍历完且没有进位为止
public static ListNode addTwoNumbers(ListNode l1,ListNode l2){
    ListNode dummy=new ListNode(0);
    ListNode current=dummy;
    int carry=0;
    while (l1!=null||l2!=null||carry!=0){
        int sum=carry;//总和初始化为进位值
        if(l1!=null){
            sum+= l1.val;
            l1=l1.next;
        }
        if(l2!=null){
            sum+= l2.val;
            l2=l2.next;
        }
        carry=sum/10;//计算新进位
        current.next=new ListNode(sum%10);//创建新节点  存储当前位的值
        current=current.next;
    }
    return dummy.next;
}
posted @ 2025-03-12 23:13  乘除法  阅读(38)  评论(0)    收藏  举报