链式A+B

本文介绍了一种使用链表表示整数的求和算法。通过遍历链表节点,实现两个链表所表示整数的相加,并处理进位问题,最终返回结果链表。文章提供了两种解决方案,一种是直接在链表上进行操作,另一种是先将链表转换为整数再进行求和。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。

给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。

测试样例:

{1,2,3},{3,2,1}
返回:{4,4,4}

思路1: 其实这道题是链表合并的问题,难点在于求每次相加后的进位,便于进行下次计算。要注意的是如果最后的进位是1,则需要再建立一个新的节点,该节点值为1。采用链表遍历,节点元素求和加进位计算,最后返回结果链表的头结点即可。

import java.util.*;
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Plus {
    public ListNode plusAB(ListNode a, ListNode b) {
        ListNode res=new ListNode(-1);//带头节点的结果链表
        ListNode head=res;//记录结果链表的头结点
        int cabit=0;//记录进位
        while(a!=null&&b!=null){
            int c1=a.val;
            int c2=b.val;
            int r=c1+c2+cabit;
            if(r>=10){
                cabit=1;
            }else{
                cabit=0;
            }
            int v=(r>=10)?r-10:r;
            ListNode node=new ListNode(v);
            res.next=node;
            res=node;
            a=a.next;
            b=b.next;
        }

        while(a!=null){
            int c1=a.val;
            int r=c1+cabit;
            if(r>=10){
                cabit=1;
            }else{
                cabit=0;
            }
            int v=(r>=10)?r-10:r;
            ListNode node=new ListNode(v);
            res.next=node;
            res=node;
            a=a.next;
        }
            while(b!=null){
            int c1=b.val;
            int r=c1+cabit;
            if(r>=10){
                cabit=1;
            }else{
                cabit=0;
            }
            int v=(r>=10)?r-10:r;
            ListNode node=new ListNode(v);
            res.next=node;
            res=node;
            b=b.next;
        }
         if(cabit==1){
            ListNode node=new ListNode(1);
            res.next=node;
            res=node;
        }
        return head.next;
    }
}

思路2:将链表转换为整数,进行求和运算,然后将整数又转换为链表即可。

import java.util.*;
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
//先将链表转换为整数,然后进行计算。
public class Plus {
    public ListNode plusAB(ListNode a, ListNode b) {
        int num1=0;
        int js=1;
        while(a!=null){
            int v=a.val; 
            num1+=v*js;
            js=10*js;
            a=a.next;
        }
        js=1;
        int num2=0;
        while(b!=null){
            int v=b.val;
            num2+=v*js;
            js=js*10;
            b=b.next;
        }
        int sum=num1+num2;
        ListNode res=new ListNode(-1);
        ListNode head=res;
        //将整数的每位存到链表
        while(sum!=0){
            int k=sum%10;
            sum/=10;
            ListNode node=new ListNode(k);
            res.next=node;//尾插
            res=node;
        }
        return head.next;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值