(LeetCode)算法题目——Add Two Numbers

给定两个非空的链表,表示两个非负整数。 数字以相反的顺序存储,每个节点包含一个数字。 添加两个数字并将其作为链表返回。

可以假设两个数字不包含任何前导零,除了数字0本身

举例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8

分析:使用变量跟踪进位,并从包含最低有效数字的列表头开始模拟逐位数字和。
(LeetCode)算法题目——Add Two Numbers_第1张图片
两个相加数字的可视化:342 + 465 =807。
每个节点包含单个数字,数字以相反的顺序存储。

就如在纸上相加两个数字一样,我们先将最低有效位的数字相加,即l1和l2的头部。由于每个数字都在0~9之间,所以两个数字相加可能会导致“溢出”(例如5+7=12)。这时,我们将当前数字设为2,并将carry=1移入下一次迭代。carry必须为0或者1,两位数最大的可能为9+9+1(进位)=19,carry不可能为2及以上的数字。

伪代码如下:

  1. 将当前节点初始化为返回列表的虚拟头。
  2. 初始化进位(carry)为0。
  3. 初始化p和q分别为l1和l2的头部。
  4. 循环l1和l2链表直到到达两者的结尾。
    (1). 将x设置为节点p的值。 如果p已经达到l1的结尾,则设置为0。
    (2).将y设置为节点q的值。 如果q已经达到l2的结尾,则设置为0。
    (3).设sum=x+y+carry.
    (4).更新carry=sum/10.
    (5).创建一个新的值为(sum mod 10)的节点并且将其设置为当前节点的下一个节点,然后将当前节点推进到下一个节点。
    (6).将p和q移到下一个节点。
  5. 检查进位carry是否为1,如果是1将新的节点加1。
  6. 返回虚拟头的下一个节点。

请注意,我们使用虚拟头来简化代码。 没有一个虚拟头,你将不得不编写额外的条件语句来初始化头的值。

//java代码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    ListNode dummyHead = new ListNode(0);
    ListNode p = l1, q = l2, curr = dummyHead;
    int carry = 0;
    while (p != null || q != null) {
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = carry + x + y;
        carry = sum / 10;
        curr.next = new ListNode(sum % 10);
        curr = curr.next;
        if (p != null) p = p.next;
        if (q != null) q = q.next;
    }
    if (carry > 0) {
        curr.next = new ListNode(carry);
    }
    return dummyHead.next;
}
/**
 * c++代码
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        ListNode c1 = l1;
        ListNode c2 = l2;
        ListNode sentinel = new ListNode(0);
        ListNode d = sentinel;
        int sum = 0;
        while (c1 != null || c2 != null) {
            sum /= 10;
            if (c1 != null) {
                sum += c1.val;
                c1 = c1.next;
            }
            if (c2 != null) {
                sum += c2.val;
                c2 = c2.next;
            }
            d.next = new ListNode(sum % 10);
            d = d.next;
        }
        if (sum / 10 == 1)
            d.next = new ListNode(1);
        return sentinel.next;
    }
}

如有问题,欢迎批评指正。

你可能感兴趣的:((LeetCode)算法题目——Add Two Numbers)