0
点赞
收藏
分享

微信扫一扫

算法练习:两数相加

爱写作的小土豆 2022-01-16 阅读 32

两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

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

示例 1:

img

输入: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
  • 题目数据保证列表表示的数字不含前导零

Related Topics

递归

链表

数学

//leetcode submit region begin(Prohibit modification and deletion)
/**
 * 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 root = new ListNode(0),cursor = root;
        int carry = 0;//表示进位
        while(l1!=null || l2!=null || carry!=0){
            int a = l1!=null ? l1.val : 0;//判断节点是否为空,如果为空就直接将a赋值为0。
            int b = l2!=null ? l2.val : 0;//判断节点是否为空
            int sum = a+b+carry;//如果上一次进位了,则carry为1
            carry = sum/10;

            ListNode new_node = new ListNode(sum%10);//产生一个新节点
            cursor.next = new_node;
            cursor = new_node;

            if(l1!=null) l1 = l1.next;
            if(l2!=null) l2 = l2.next;

        }

        return root.next;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

总结:

​ 这里并不是将每个链表的值先相加后再转换为链表(老实的我刚开始就这样想的),而是两个链表从链表头部到链表尾部依次相加,判断是否进位(设置一个变量,这个变量的值要么是不进位0或者进位1)来确定下一个节点的情况(即直接加上这个变量)。直到两个链表都为空并且进位为0时才结束循环。

易错:

​ 刚开始,我在循环里新建变量,这明显是不行的。出了这个循环这个变量就不存在了,所以就在刚开始声明了root链表来存放目的链表的头节点,然后又声明了一个cursor游标指针来遍历整个链表,并且在循环里新建的变量也赋值给游标变量(被游标变量操作),使这些新建的节点出循环后能够一直存在。

举报

相关推荐

0 条评论