554 字
3 分钟
2. 两数相加
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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- 题目数据保证列表表示的数字不含前导零
代码
/** * 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 result = new ListNode();
// 用来存储结果的尾结点 ListNode p = result;
// 表示是否有进位 1:有, 0:没有 int flag = 0;
// 用来存放运算中间值的变量 int num1 = 0; int num2 = 0; int tmp = 0; /** * l1 != null || l2 != null 成立直到两个列表都遍历完 * flag != 0 成立表示没有进位 * * 当两个列表都遍历完,并且没有进位时,循环结束 */ while(l1 != null || l2 != null || flag != 0) { /** * [1],[1,1,1] * 可以看成 * [1,0,0],[1,1,1] * 当其中一个列表遍历完时,所有的数用0替代 */ num1 = (l1 == null) ? 0 : l1.val; num2 = (l2 == null) ? 0 : l2.val;
/** * 计算相应的和, * 如果超过10,进位(flag = 1) * 如果小于10, 不进位(flag = 0) * 然后把 两数之和 取个位数添加进结果列表 */ tmp = num1 + num2 + flag; flag = tmp / 10; tmp = tmp % 10; p.next = new ListNode(tmp); p = p.next;
/** * 只有当列表不为空时,才移动指针 * 防止空一场 */ if(l1 != null) l1 = l1.next; if(l2 != null) l2 = l2.next; }
// 返回头指针之后的列表 return result.next; }}原文链接:CSDN