java---单链表加法

题目:

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

思路:
用递归来实现,
递归的出口:A,B结点都为空,且进位数值也为0

注意递归传递参数的设计,先判断是否为null,是则传递null,否则传递链表的next
在这里插入图片描述代码:

package LianBiao;

public class 链表加法 {

    //构建节点
    public static class ListNode{
        ListNode next;
        int value;

        public ListNode(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) {
        //创建两个链表
        int[] arr1={7,4,0,7,5};
        ListNode A=new ListNode(arr1[0]);
        ListNode p=A;
        for (int i = 1; i <arr1.length ; i++) {
            p.next=new ListNode(arr1[i]);
            p=p.next;
        }
        p=A;
        while (p!=null){
            System.out.print(p.value+"  ");
            p=p.next;
        }
        System.out.println();


        int[] arr2={2,7,2,3,4};
        ListNode B=new ListNode(arr2[0]);
        ListNode p2=B;
        for (int i = 1; i <arr2.length ; i++) {
            p2.next=new ListNode(arr2[i]);
            p2=p2.next;
        }
        p2=B;
        while (p2!=null){
            System.out.print(p2.value+"  ");
            p2=p2.next;
        }
        System.out.println();

        //调用方法
        int m=A.value+B.value;
        ListNode node=jiaFa(A,B,m>=10?1:0);
        while (node!=null){
            System.out.print(node.value+"  ");
            node=node.next;
        }


    }

    private static ListNode jiaFa(ListNode a, ListNode b, int i) {
        //递归出口
        if (a==null && b==null && i==0)  //当a,b都没数值了,进位也为0了,结束递归
            return null;
        
        //算两个链表相对应加数的结果,  value>=10?1:0  用于进位数值    value%10用于存放结果数值
        int value=i;
        if (a!=null){
            value+=a.value;
        }
        if (b!=null){
            value+=b.value;
        }
        // value%10 算结果
        ListNode node=new ListNode( value%10);  //创建新的节点存结果
        //递归调用
        node.next=jiaFa(a==null?null:a.next,b==null?null:b.next,value>=10?1:0); //注意value等于10也要进位

        return node;
    }

}

力扣:两数相加
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

        int s=0;

        ListNode node=new ListNode(0),p=node;

        while(l1!=null || l2!=null || s!=0){
            if(l1!=null){
                s=s+l1.val;
                 l1=l1.next;
            }
            if(l2!=null){
                s=s+l2.val;
                l2=l2.next;
            }
    
       
           p.next=new ListNode(s%10);  //保存到结果链表的数字
           p=p.next;
           s/=10;  //进位数字

        }

        return node.next;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值