算法三:两数相加

题目内容

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例图
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers

算法思想

该算法和两单链表合并算法思想相同,只不过该算法是两数相加。这里记两链表分别为l1和l2,进位标志为count,新的单链表l3(也可以不设置该单链表)。
这里要考虑的情况有一下几种:

  • 正常情况下的两数相加:若和小于10则直接通过尾插法插入新的单链表l3,否则通过如下步骤再插入单链表中:l3.val=l1.val+l2.val-10和count=1。
while (p!=null&&q!=null){
            num=p.val+q.val;
            if(count==1){
                num+=1;
            }
            if(num>=10){
                count=1;
                num=num-10;
                addNode(num,day_03); //这里addNode是增加danlian
            }else{
                count=0;
                addNode(num,day_03);
            }
            p=p.next;
            q=q.next;
        }
  • 两单链表长度不同:当一个遍历结束时需要判断单链表是否为空,若没有为空时,则判断进位标志count是否为1。
if(count==1){
    if(p!=null){
         while(p!=null){
              num=p.val+count;
                  if(num>=10){
                      count=1;
                      num=num-10;
                      addNode(num,day_03);
                  }else{
                      addNode(num,day_03);
                      count=0;
                  }
                  p=p.next;
         }
     }
}
else{
    if(p!=null){
          while(p!=null){
              num=p.val;
              addNode(num,day_03);
              p=p.next;
          }
   }
}

注意:这里我只放入一个单链表的情况,另一个单链表在整体算法中可以看到(这种情况可以单独编写一个方法体,这种写法不建议,编者主要是懒,就没有改写方法体)。

整体算法

public class Day_03 {
    static Scanner input=new Scanner(System.in);

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int count=0;
        int num=0;
        ListNode day_03=new ListNode();
        ListNode q,p;
        p=l1.next;
        q=l2.next;
        while (p!=null&&q!=null){
            num=p.val+q.val;
            if(count==1){
                num+=1;
            }
            if(num>=10){
                count=1;
                num=num-10;
                addNode(num,day_03);
            }else{
                count=0;
                addNode(num,day_03);
            }
            p=p.next;
            q=q.next;
        }
        if(count==1){
            if(p!=null){
               while(p!=null){
                  num=p.val+count;
                  if(num>=10){
                      count=1;
                      num=num-10;
                      addNode(num,day_03);
                  }else{
                      addNode(num,day_03);
                      count=0;
                  }
                  p=p.next;
               }
            }
            if(q!=null){
                while(q!=null){
                    num=q.val+count;
                    if(num>=10){
                        count=1;
                        num=num-10;
                        addNode(num,day_03);
                    }else{
                        addNode(num,day_03);
                        count=0;
                    }
                    q=q.next;
                }
            }
        }else{
            if(p!=null){
                while(p!=null){
                    num=p.val;
                    addNode(num,day_03);
                    p=p.next;
                }
            }
            if(q!=null){
                while(q!=null){
                    num=q.val;
                    addNode(num,day_03);
                    q=q.next;
                }
            }
        }
        if (count==1){
            addNode(count,day_03);
        }
        ListNode day03=day_03.next;
        return day03;
    }
    public static void addNode(int data,ListNode head){
        ListNode newNode = new ListNode(data);
        newNode.next=null;
        if(head==null){
            head = newNode;
        }else{
            ListNode temp = head;
            while(temp.next != null){
                temp = temp.next;
            }
            temp.next = newNode;
        }
    }
    public static void main(String[] args) {
        int j=0;

        //输入数据
        String day_03_num=new String();
        day_03_num=input.nextLine();

        String day_03_num1=new String();
        day_03_num1=input.nextLine();

        //去掉[,]两符号
        String day_03_search=new String();
        for (int i = 1; i < day_03_num.length()-1; i++) {
            day_03_search+=day_03_num.charAt(i);
        }
        String day_03_search1=new String();
        for (int i = 1; i < day_03_num1.length()-1; i++) {
            day_03_search1+=day_03_num1.charAt(i);
        }
        //根据逗号拆分字符串
        String [] day_03_Truenum=day_03_search.split(",");
        String [] day_03_Truenum1=day_03_search1.split(",");
        ListNode l1=new ListNode();
        ListNode l2=new ListNode();
        //将字符串数组转换为数字数组
        for (int i = 0; i <day_03_Truenum.length ; i++,j++) {
            addNode(Integer.valueOf(day_03_Truenum[i]),l1);
            if(j<day_03_Truenum1.length){
                addNode(Integer.valueOf(day_03_Truenum1[j]),l2);
            }
        }
        ListNode day_03=addTwoNumbers(l1,l2);
        while (day_03!=null){
            System.out.println(day_03.val);
            day_03=day_03.next;
        }
    }
}

尾语

该算法可能有些复杂,如有良好的算法可在下方评论分享出来,大家一起学习一起进步。该题是力扣上的题,若有侵权,请及时告知。该题链接:https://leetcode-cn.com/problems/add-two-numbers/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lveson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值