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

来源:互联网 发布:nginx 内网端口转发 编辑:程序博客网 时间:2024/06/07 04:58

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

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

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

分析:使用变量跟踪进位,并从包含最低有效数字的列表头开始模拟逐位数字和。
这里写图片描述
两个相加数字的可视化: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;    }}

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

原创粉丝点击