【LeetCode题解】2_两数相加

描述

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。

你可以假设除了数字 0 之外,这两个数字都不会以零开头。

示例:

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

方法一:小学数学

思路

按照小学数学中求两数之和的做法,从最低位(链表表头)开始加起,用变量 carry 保存进位的结果(初始值为0),每次求和之后更新变量 carry 的值。

Java 代码(非递归写法)

/**
* 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) {
ListNode dummyHead = new ListNode(-1);
ListNode curNode = dummyHead, p = l1, q = l2;
int carry = 0; while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = x + y + carry;
carry = sum / 10;
curNode.next = new ListNode(sum % 10);
curNode = curNode.next; if (p != null) {
p = p.next;
}
if (q != null) {
q = q.next;
}
} if (carry > 0) {
curNode.next = new ListNode(carry);
} return dummyHead.next;
}
}
// Runtime: 38 ms
// Your runtime beats 46.06 % of java submissions.

复杂度分析:

  • 时间复杂度:\(O(max(m, n))\),其中 \(m\) 和 \(n\) 分别表示两个链表的长度。
  • 空间复杂度:\(O(max(m, n))\),返回链表的长度最多为 \(max(m, n) + 1\)。

Java 代码(递归写法)

/**
* 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) {
return addTwoNumbers(l1, l2, 0);
} private ListNode addTwoNumbers(ListNode l1, ListNode l2, int carry) {
// Recursive termination condition
if (l1 == null && l2 == null) {
return carry > 0 ? new ListNode(carry) : null;
} int sum = carry;
ListNode l1Next = null, l2Next = null;
if (l1 != null) {
sum += l1.val;
l1Next = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2Next = l2.next;
}
ListNode curr = new ListNode(sum % 10);
curr.next = addTwoNumbers(l1Next, l2Next, sum / 10);
return curr;
}
}
// Runtime: 27 ms
// Your runtime beats 94.02 % of java submissions.

复杂度分析同上。

Python 代码(非递归写法)

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None class Solution:
def addTwoNumbers(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
dummy_head = ListNode(-1)
cur = dummy_head
carry = 0 while l1 or l2 or carry:
v1 = v2 = 0
if l1:
v1 = l1.val
l1 = l1.next
if l2:
v2 = l2.val
l2 = l2.next
carry, val = divmod(v1 + v2 + carry, 10)
cur.next = ListNode(val)
cur = cur.next
return dummy_head.next # Runtime: 156 ms
# Your runtime beats 43.08 % of python3 submissions.

复杂度分析同上。

最新文章

  1. 如何用CSS实现在新窗口打开链接?
  2. 烂泥:学习ssh之ssh密钥随身携带
  3. Spring Framework------>Class RestTemplate----->
  4. UVA 1515 Pool construction 水塘(最大流,经典)
  5. NGUI学习笔记(二):基础笔记
  6. HDOJ/HDU 2544 最短路---dijkstra算法
  7. POJ3189_Steady Cow Assignment(二分图多重匹配/网络流+二分构图)
  8. Microsoft Fakes进行单元测试
  9. hdu_5776_sum(前缀和维护)
  10. label自适应
  11. 【SqlServer系列】语法定义符号解析
  12. LeetCode之“链表”:Reorder List
  13. java Map遍历
  14. css 如何让背景图片拉伸填充避免重复显示
  15. Python12/10--前端之display/overflow使用/清浮动的方式
  16. echarts画多条一元回归线
  17. centos7上为什么不使用libcgroup进行资源限制
  18. Mini Twitter
  19. MySQL备份与恢复-innobackupex
  20. 20145333茹翔 Exp7 网络欺诈技术防范

热门文章

  1. Spring学习(六)——集成memcached客户端
  2. java的一些命名规范吧
  3. 关于My Sql update语句不能用子查询的解决办法
  4. html Canvas 画图 能够选择并能移动
  5. UWP开发砸手机系列(一)—— Accessibility
  6. Linq的Join == 两个foreach
  7. php函数源代码 C编写 【持续更新】
  8. php中的XML DOM(10)
  9. codeforces 1093 题解
  10. 护网杯圆满结束,还不满足?不如来看看大佬的WP扩展思路~