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; // 返回所得的和,其是链表形式,且是逆序的 } }

 

posted @ 2023-05-17 20:38  RS_mine  阅读(58)  评论(0)    收藏  举报