Leetcode No.2-两数相加

难度:中等

给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
            输出:7 -> 0 -> 8
原因:342 + 465 = 807

该题难度已经为我们降低了,因为已经为我们翻转了链表,是逆序计算的。但我们要注意几种特殊情况:

  • 需要考虑的几种特殊情况

所以,为了避免以上几种特殊情况不能顺利通过,我们希望的是两个链表的长度一样长,就更加容易计算了。所以,我们在循环里时,先让两个列表对齐,空位置部分补零,然后再逐位计算。
但进行逐位计算的时候,我们要注意进位数carry的值,这个值,我们给carry的初值为0,但是如果相加和为大于等于10的值的时候,carry就被置为1
最后,要考虑最后末尾的进位问题,进行一次判断,如果l1l2都到了最后一位还需要进位的话,就在最后再新建一个值为1的结点。

方法一:(补齐链表,数学计算法)

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        int carry = 0; //设置进位
        ListNode result = l1;   //
        
        while(l2!=null){
            if(l1.next == null && l2.next!=null){
                //如果l1没有l2长,那么l1补0
                l1.next = new ListNode(0);
            }
            if(l2.next == null && l1.next!=null){
                //如果l2没有l1长,那么l2补0
                l2.next = new ListNode(0);
            }
            l1.val = carry + l1.val + l2.val;
            //进位的计算
            if(l1.val/10>0)
                carry = 1; 
            else
                carry = 0;
            //末尾进位的处理
            if(l1.val/10>0 && l1.next==null && l2.next==null)
               l1.next = new ListNode(1);

            l1.val = l1.val%10;
            l1 = l1.next;
            l2 = l2.next;
        }

        return result;
    }
} 
复杂度分析:
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。