002.两数相加

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。
例:输入:l1 = [2,4,3], l2 = [5,6,4],输出:[7,0,8] ---> 342 + 465 = 807.
链接:https://leetcode-cn.com/problems/add-two-numbers

示例一.png

①这道题等价于两条单链表的加法运算,需要分别遍历两条链表,将对应位相加,需要特别注意进位问题,这里用cur表示,每次运算cur为前一位的进位,并加入当前位上,循环迭代的条件为l1!=null || l2!=null || cur!=0
②l1=l1.next的往后遍历的方式前面要加上if(l1!=null)的条件,因为while中的条件是||,当l1为null时就不能再继续往后递归了。
③注意诸多next之间的相互关系,链表关系要理清楚。

/**
 * 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) {
        if(l1==null) return l2;//如果其中一个为0,则返回另一个链表
        if(l2==null) return l1;

        ListNode res=new ListNode();//结果链表
        ListNode pres=res;          //指向结果链表的指针
        int cur=0;
        while(l1!=null || l2!=null || cur!=0){
            int v1=(l1==null)?0:l1.val;//l1对应位上的数
            int v2=(l2==null)?0:l2.val;//l2对应位上的数
            int temp=v1+v2+cur;//进位
            res.next=new ListNode(temp%10);
            cur=temp/10;
            res=res.next;  
            if(l1!=null) l1=l1.next;
            if(l2!=null) l2=l2.next;       
        }
        return pres.next;
    }
}

你可能感兴趣的:(002.两数相加)