LeetCode中如何实现两数相加的算法?
- 内容介绍
- 文章标签
- 相关推荐
本文共计886个文字,预计阅读时间需要4分钟。
题目信息+地址:两数相加+给你两个非空的链表,表示两个非负的整数。按照相同的形式返回它们的和。
解题思路:
1.创建一个哑节点作为新链表的头部。
2.遍历两个链表,将对应位相加,并处理进位。
3.将相加的结果存储在新链表中。
4.返回新链表的头部。
代码实现:
python
定义链表节点class ListNode: def __init__(self, val=0, next=None): self.val=val self.next=nextdef addTwoNumbers(l1, l2): # 创建哑节点 dummy=ListNode() current=dummy carry=0
# 遍历两个链表 while l1 or l2 or carry: # 获取当前位相加的结果 sum_val=(l1.val if l1 else 0) + (l2.val if l2 else 0) + carry carry=sum_val // 10 sum_val=sum_val % 10
# 创建新节点,并连接到当前节点 current.next=ListNode(sum_val) current=current.next
# 移动到下一个节点 if l1: l1=l1.next if l2: l2=l2.next
# 返回新链表头部 return dummy.next
题目信息源地址:两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例 2
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示
- 每个链表中的节点数在范围
[1, 100]内 0 <= Node.val <= 9- 题目数据保证列表表示的数字不含前导零
这道题目将两个链表结合成一个链表,比较清晰的思路就是,类似于四则运算中的加法,从个位往高位进行每一位相加,如果当前位的结果大于等于 10 时则需要在高位加 1。
解析到程序当中,既可以使用循环的方式,也可以使用递归的思维。循环的方式是将两个链表同步递增,而递归的方式是每次计算完一位时再对链表的下一个结点做递归处理。
通过循环的方式解决这个问题,时间复杂度是 \(O(n)\),空间复杂度也是 \(O(n)\),这里的 n 指的是最长的那个链表节点数。
package cn.fatedeity.algorithm.leetcode;
public class AddTwoNumbers {
public ListNode answer(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
ListNode listNode = result;
boolean addOne = false;
while (l1 != null || l2 != null || addOne) {
int sum = 0;
if (l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}
if (addOne) {
sum += 1;
}
addOne = sum >= 10;
listNode.next = new ListNode(sum % 10);
listNode = listNode.next;
}
return result.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
首发于翔仔的个人博客,点击查看更多。
本文共计886个文字,预计阅读时间需要4分钟。
题目信息+地址:两数相加+给你两个非空的链表,表示两个非负的整数。按照相同的形式返回它们的和。
解题思路:
1.创建一个哑节点作为新链表的头部。
2.遍历两个链表,将对应位相加,并处理进位。
3.将相加的结果存储在新链表中。
4.返回新链表的头部。
代码实现:
python
定义链表节点class ListNode: def __init__(self, val=0, next=None): self.val=val self.next=nextdef addTwoNumbers(l1, l2): # 创建哑节点 dummy=ListNode() current=dummy carry=0
# 遍历两个链表 while l1 or l2 or carry: # 获取当前位相加的结果 sum_val=(l1.val if l1 else 0) + (l2.val if l2 else 0) + carry carry=sum_val // 10 sum_val=sum_val % 10
# 创建新节点,并连接到当前节点 current.next=ListNode(sum_val) current=current.next
# 移动到下一个节点 if l1: l1=l1.next if l2: l2=l2.next
# 返回新链表头部 return dummy.next
题目信息源地址:两数相加
给你两个非空 的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
示例 2
输入:l1 = [0], l2 = [0]
输出:[0]
示例 3
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]
提示
- 每个链表中的节点数在范围
[1, 100]内 0 <= Node.val <= 9- 题目数据保证列表表示的数字不含前导零
这道题目将两个链表结合成一个链表,比较清晰的思路就是,类似于四则运算中的加法,从个位往高位进行每一位相加,如果当前位的结果大于等于 10 时则需要在高位加 1。
解析到程序当中,既可以使用循环的方式,也可以使用递归的思维。循环的方式是将两个链表同步递增,而递归的方式是每次计算完一位时再对链表的下一个结点做递归处理。
通过循环的方式解决这个问题,时间复杂度是 \(O(n)\),空间复杂度也是 \(O(n)\),这里的 n 指的是最长的那个链表节点数。
package cn.fatedeity.algorithm.leetcode;
public class AddTwoNumbers {
public ListNode answer(ListNode l1, ListNode l2) {
ListNode result = new ListNode();
ListNode listNode = result;
boolean addOne = false;
while (l1 != null || l2 != null || addOne) {
int sum = 0;
if (l1 != null) {
sum += l1.val;
l1 = l1.next;
}
if (l2 != null) {
sum += l2.val;
l2 = l2.next;
}
if (addOne) {
sum += 1;
}
addOne = sum >= 10;
listNode.next = new ListNode(sum % 10);
listNode = listNode.next;
}
return result.next;
}
}
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
首发于翔仔的个人博客,点击查看更多。

