给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

力扣原题:两数相加。

 先贴代码:

public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode(-1); //定义一个新链表的头节点l3
        ListNode node3 = l3; //定义头节点的副本node3
        int ex = 0; //定义一个进位值ex

        while (l1 != null || l2 != null){
            ListNode nodeNext = new ListNode(-1); //定义node的后继节点
            node3.next = nodeNext;
            //将l1的val赋值给a
            int a = 0;
            if (l1 != null){
                a = l1.val;
            }
            //将l2的val赋值给b
            int b = 0;
            if (l2 != null){
                b = l2.val;
            }
            //将a和b的和赋值给c再加上进位值ex即为放入新链表的和
            int c = a + b + ex;
            //进行判断;若c >= 10 则产生进位值
            if (c >= 10){
                c =  c - 10;
                nodeNext.val = c;
                ex = 1;
            }else {
                nodeNext.val = c;
                ex = 0;
            }

            //以下各节点往后走一步
            node3 = node3.next;
            if (l1 != null) {
                l1 = l1.next;
            }
            if (l2 != null) {
                l2 = l2.next;
            }
        }
        //若循环走完仍然有进位值,则说明最后一位值位10,所以再新建一个尾巴节点值位1
        if (ex == 1){
            ListNode cur = new ListNode(1);
            node3.next = cur;
        }
        //返回头节点的next域
        return l3.next;
    }

解题思路

在本题题目中给了我们两条链表,分别表示两个非负的整数,每位数字都是按照逆序的方式存储的。说明一条链表表示的整数正确读法应该是反过来读;例如链表:2->3->4 ,那它表示的数字应该为432。所以每一个链表第一个节点都代表着个位数。即在两数相加过程中,进位值都会进入next域,由此我便想到了,先创建一个新的链表,新链表每个节点都来储存其两条链表各节点相加的值:

然后就可以设定循环,要求链表1和链表2都走完时循环结束: 

 

 进入循环后新建一个节点来存储链表1和链表2节点的和:

 再将链表1和链表2的节点值相加:

注意:进入循环前已经设定了进位值ex为0,代表开始时没有进位。 

对节点和c进行判断,若其大于等于10说明产生了进位值,将ex赋为1,传入下一次循环中。

 之后将各节点往后走一步:

注意:为了避免空指针异常,链表1和链表2在遍历时需要判断其是否为null,若是则不能将其指向next域。 

等待循环走完后若此时进位值ex为0,说明原先两条链表最后一个节点相加值小于10,就不需要进位了;若ex值位1,说明已经产生进位,还需要再新建一个节点,其值为1,接到新链表的后面。此时就会有疑问:为什么新建节点val值为1?

在原题目中提示了Node.val值域是0到9,所以两节点之和最大也只是18,即若有进位值的话,它的值有且仅有1,所以新建节点值位1。 

PS:此题解仅为个人解法,可能并非最优解法,若有错误及疑问欢迎指出。

  • 24
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值