LC2. 两数相加
Q:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储 一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
示例1:
输入: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- 题目数据保证列表表示的数字不含前导零
A:思路:本题难度属于中等,可能是由于题目给的已经是逆序的链表,不需要再反转链表了,所以可以按照从左至右,即从个位数加至更高的位(即常规的两个整数的加法思想).....,刚拿到该题,可能会有的疑惑是:
① 遇到其中一个节点为null而另一个不为null时该怎么处理,其null对应的数值是什么?
② 进位问题怎么去解决?
对于问题①,我们给出的解决方案是,先判断节点是否为null,并取其值,再进行相加操作,若遇到其中一个为null的节点时,我们将其对应的数值置为0,而遇到不为null的节点,则取其所对应的数值。
对于问题②,我们给出的解决方案是,设置一个整形变量carry(n. 进位)作为进位标记,初始化为0,每次求和时使用sum = x + y + carry来计算和,并立马求得下一次可能的进位值carry = sum / 10并保存起来,供下次使用,除此之外,当需要求和的两个节点均为null时,我们要最后判断一下,如果此时carry是一个大于0的数值,那么说明,原来的两个三位数相加其和变成了四位数(举例),此时就要新增一个进位节点。
以下是Java代码,仅供参考:
/**
* 这里是链表的定义,面试可能会考察,需要会写出。
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyNode = new ListNode(-1); // 定义一个哑节点,用来指向生成新的链表
ListNode cur = dummyNode; // 设置处理节点的当前指针
int carry = 0; // 设置进位,初始为0
while(l1 != null || l2 != null){
int x = l1 == null ? 0 : l1.val; // 若l1不为null,x取其val,若为null,x取0
int y = l2 == null ? 0 : l2.val; // 若l2不为null,x取其val,若为null,x取0
int sum = x + y + carry; // 求和,记得要带上进位哦
carry = sum / 10; // 求得进位,以供下一次求和使用
sum = sum % 10; // 获取求和后的余数,即为新节点的值
cur.next = new ListNode(sum); // new 一个新节点,将值设置为sum,并将cur的next指针指向新节点
cur = cur.next; // cur指针向后移动
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(carry > 0){ // 判断是否需要新增一个进位节点
cur.next = new ListNode(carry);
}
return dummyNode.next; // 返回所得的和,其是链表形式,且是逆序的
}
}

浙公网安备 33010602011771号