算法—链表A+B

题目

题目描述
有两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表的首部。编写函数对这两个整数求和,并用链表形式返回结果。
给定两个链表ListNode* A,ListNode* B,请返回A+B的结果(ListNode*)。
测试样例:
{1,2,3},{3,2,1}
返回:{4,4,4}

分析

引入一个flag,代表是否进位,每次按位相加之前,都要判断是否有进位;每次按位相加之后,都要判断是否需要进位。

代码

import java.util.*;

public class Plus {
    public ListNode plusAB(ListNode a, ListNode b) {
        //引入一个flag,代表是否进位
        if(a==null && b==null){
            return null;
        }else if(a==null){
            return b;
        }else if(b==null){
            return a;
        }
        boolean flag = false; //标记是否需要进位
        ListNode c = new ListNode(0);
        ListNode p1 = a;
        ListNode p2 = b;
        ListNode p3 = c;
        int sum = 0; //sum为按位加和
        while(p1!=null && p2!=null){
            if(flag){
                sum = p1.val+p2.val+1;
            }else{ //没有进位
                sum = p1.val+p2.val;
            }
            if(sum >= 10){ //又有进位
                flag = true;
                sum = sum-10;
            }else{
                flag = false; //将进位置为false
            }
            ListNode node = new ListNode(sum);
            p3.next = node;
            p3 = node;
            sum = 0; //将sum重新置0
            p1 = p1.next;
            p2 = p2.next;
        }
        while(p1!=null){ //a的位数比b多
            if(flag){
                sum = p1.val+1;
            }else{
                sum = p1.val;
            }
            if(sum >= 10){ //又有进位
                flag = true;
                sum = sum-10;
            }else{
                flag = false; //将进位置为false
            }
            ListNode node = new ListNode(sum);
            p3.next = node;
            p3 = node;
            sum = 0; //将sum重新置0
            p1 = p1.next;
        }
        while(p2!=null){
            if(flag){
                sum = p2.val+1;
            }else{
                sum = p2.val;
            }
            if(sum >= 10){ //又有进位
                flag = true;
                sum = sum-10;
            }else{
                flag = false; //将进位置为false
            }
            ListNode node = new ListNode(sum);
            p3.next = node;
            p3 = node;
            sum = 0; //将sum重新置0
            p2 = p2.next;
        }
        if(flag){ //最后还有一个进位
            ListNode node = new ListNode(1);
            p3.next = node;
            p3 = node;
        }
        return c.next;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值