LeetCode -- 2.两数相加

问题描述

LeetCode -- 2.两数相加_第1张图片

给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。LeetCode -- 2.两数相加_第2张图片

思路

由于整数的每位数字是由逆序的方式被链表存储,因此第一个想法是用栈,将两个整数还原之后进行相加,之后再根据相加之后的结果创建新的链表。但是这么做太过麻烦,就想找别的方式。
根据示例一的图像我们可以发现,即便他们是逆序的,但结果也是逆序的,因此直接正向求解即可。就拿示例一举例:2 + 5 = 7, 4 + 6 = 10, 3 + 4 + 1(上一位的进1) = 8,完全符合结果。

注意点:

(1)两个整数长度不一定相同。因此,当其中一个整数被遍历完之后,可以看作它之后的位数都为0,另外一个整数只需要考虑和进位相加即可。
(2)当两个整数都遍历完之后,可能还有进位,要考虑这种情况。

代码

	public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode p = l1, q = l2;
        ListNode res = new ListNode(0);
        ListNode temp = res;
        int before = 0;  //用于标记是否有进位
        while (p != null && q != null) {	//两个整数都有位数
            int num = p.val + q.val + before;  //求和,记得要加上进位
            before = num < 10 ? 0 : 1;  //如果当前和大于等于10,说明有进位,before为1;反之为0
            temp.next = new ListNode(num %10);  //num%10得到的就是最终当前结果,建立新的节点加到res后面
            temp = temp.next;
            p = p.next;  //下一位
            q = q.next;  //下一位
        }
        while (p != null) {		//整数p还没遍历完,而整数q已经结束
            int num = p.val + before;	//此时只需要p的值与进位相加
            before = num < 10 ? 0 : 1;
            temp.next = new ListNode(num %10);
            temp = temp.next;
            p = p.next;
        }	
        while (q != null) {		//整数q还没遍历完,而整数p已经结束
            int num = q.val + before;	//此时只需要q的值与进位相加
            before = num < 10 ? 0 : 1;
            temp.next = new ListNode(num %10);
            temp = temp.next;
            q = q.next;
        }
        if(before == 1) {  //两个数都遍历结束但还有进位
            temp.next = new ListNode(1); //要把进位补上
        }
        return res.next; //res指向的是初始化建立的值为0的节点,res.next才是最终结果的第一位,因此要返回res.next
    }

你可能感兴趣的:(LeetCode,leetcode,算法)