【Leetcode问题搬运翻译】Add two numbers

来源:互联网 发布:c stl 源码 编辑:程序博客网 时间:2024/05/22 06:08

/**

*本篇文章均为本人翻译,原问题链接:点击打开链接

*/


问题描述:你被给予两个非空链表,分别代表两个非负整数。这些数字以倒序的方式存储并且他们的每个节点都包含一个数字。添加两个数字,并将其作为链表返回。

 

你可以假设这两个数字第一位不为0,除了0本身。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出: 7 -> 0 -> 8


例子:添加的两个数:342+465=708有进位就加一


 



思路:

正如你如何在纸面上计算两个数字一样,我们首先从最低位加起,这就是l1l2链表的头部。由于每个数字都排布在09之间,加和两个数可能会溢出,例如5+7=12。在这种情况下,我们把当前的数字设置为2,并且把进位设置为1带入下一个循环,进位一定是0或者1,因为两个数的最大可能加和(包括进位)为9+9+1=19


伪代码如下:

*将当前节点初始化为返回列表的虚拟头

*初始化进位为0

*将l1和l2的头分别初始化为p和q

*遍历l1和l2直到你到达了底部

      #把x设置为节点p的值。如果p到达了l1的底部,x为0

      #把y设置为节点q的值。如果q到达了l2的底部,y为0

      #设置sum=x+y+进位

      #更新进位=sum/10

      #创建一个新的节点,并且赋给他sum除10取余的值,然后将其设置为当前节点的下一个节点,再将当前节点转发到下一个节点。

      #p和q同时推进

*检测,进位是否为1,如果是的话,将一个新的节点加上数字1到返回列表中。

*返回虚拟头的下一个节点



 

注意我们使用虚拟头简化代码。如果没有一个虚拟头,您必须编写额外的条件语句来初始化头部的值。对下列情况要格外小心



测试案例解释l1=[0,1]
l2=[0,1,2]l2=[0,1,2]一个链表比另一个链表长l1=[]
l2=[0,1]l2=[0,1]

一个链表为空,是空链表
l1=[9,9]
l2=[1]l2=[1]这个总数在最后可能有一个额外的进位,这很容易忘记。














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;}
复杂性分析:


时间复杂性:假设m,n分别代表l1l2的长度,上诉算法最多叠加max(m,n)

空间复杂性:新链表的长度最多是max(m,n)+1

 


新问题:


如果链表中的数据不是倒序存放呢?

例子:(3->4->2+(4->6->5)=8->0->7

原创粉丝点击