中文题目
给定两个 非空链表 l1
和 l2
来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0] 输出:[0]
提示:
- 链表的长度范围为
[1, 100]
0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
注意:本题与主站 445 题相同:https://leetcode-cn.com/problems/add-two-numbers-ii/
通过代码
高赞题解
剑指offerII025.链表中的两数相加
https://leetcode-cn.com/problems/lMSNwu/solution/shua-chuan-jian-zhi-offer-day13-lian-bia-cl27/
难度:中等
题目:
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
提示:
- 链表的长度范围为 [1, 100]
- 0 <= node.val <= 9
- 输入数据保证链表代表的数字无前导 0
示例:
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4]
输出:[7,8,0,7]
示例2:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[8,0,7]
示例3:
输入:l1 = [0], l2 = [0]
输出:[0]
分析
这道题目是力扣的第二题两数相加的进阶版本。第二题是整数从低位向高位保存求加和。 但是这道题却是整数从高位到低位求加和的操作。由于是单向链表,当低位存在进位时,我们没办法返回到之前的节点进行进位操作。
所以这道题,我们需要先反转链表后,在进行加法操作,最后在将加和的结果反转后输出。 由于上一道题目:
我们已经写好了反转链表的方法,所以在这里就可以直接复用了!具体解法如下:
解题:
class Solution:
def reverseList(self, head):
pre, cur = None, head
while cur:
tmp = cur.next
cur.next = pre
pre, cur = cur, tmp
return pre
def addTwoNumbers(self, l1, l2):
rev_l1 = self.reverseList(l1)
rev_l2 = self.reverseList(l2)
count = 0
ret = ListNode()
tmp = ret
while rev_l1 or rev_l2 or count:
num = 0
if rev_l1:
num += rev_l1.val
rev_l1 = rev_l1.next
if rev_l2:
num += rev_l2.val
rev_l2 = rev_l2.next
count, num = divmod(num + count, 10)
tmp.next = ListNode(num)
tmp = tmp.next
return self.reverseList(ret.next)
class Solution {
private ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode rev_l1 = this.reverseList(l1);
ListNode rev_l2 = this.reverseList(l2);
int count = 0;
ListNode ret = new ListNode(0);
ListNode cur = ret;
while (rev_l1 != null || rev_l2 != null || count != 0) {
int num = 0;
if (rev_l1 != null) {
num += rev_l1.val;
rev_l1 = rev_l1.next;
}
if (rev_l2 != null) {
num += rev_l2.val;
rev_l2 = rev_l2.next;
}
num += count;
count = num >= 10 ? 1 : 0;
cur.next = new ListNode(num - count * 10);
cur = cur.next;
}
return this.reverseList(ret.next);
}
}
欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。
有喜欢力扣刷题的小伙伴可以加我微信(King_Uranus)互相鼓励,共同进步,一起玩转超级码力!
我的个人博客:https://qingfengpython.cn
力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
6254 | 10421 | 60.0% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|