力扣(LeetCode)第二题—两数相加

题目描述:

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

 输入:l1 = [2,4,3], l2 = [5,6,4]

 输出:[7,0,8]

解释:342 + 465 = 807.

此题我们一定要注意审题,数字每位按照逆序存储,要知道链表存储的正确数字才开始相加

接下来,就是解决如何相加了

  1. 我们知道两数相加是从个位开始,而数字刚好在链表中逆序存储,两个链表的头部正是数字最后一位数,这样就可以按链表顺序相加了
  2. 再就是判断是否进位,和大于10就进位,而且进位只可能是1

代码实现:

public class LeetCode2 {
        public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
            ListNode dummyHead =new ListNode(-1);//虚拟头节点
            ListNode prev = dummyHead;
            int a = 0;//用来判断是否进位
            while (l1 != null || l2 != null){//有一个不空就需要执行
                int x = (l1 != null) ? l1.val : 0;
                int y = (l2 != null) ? l2.val : 0;
                int sum = x + y + a;
                prev.next = new ListNode(sum%10);
                prev = prev.next;//指针向后移动
                a = sum/10;
                l1 = (l1!=null) ? l1.next : null;//l1,l2也往后移一位
                l2= (l2!=null) ? l2.next : null;
            }
            if (a > 0){//遍历结束后,a>0则需要在链表的后面附加一个节点
                prev.next = new ListNode(a);
            }
            return dummyHead.next;

        }

    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值