给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 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) {
- int flag = 0;
- int count = 0;
- ListNode ans = new ListNode(0);
- ListNode now = ans;
- while(l1 != null || l2 != null) {
- int add1 = l1 == null? 0 : l1.val;
- int add2 = l2 == null? 0 : l2.val;
- int sum = add1 + add2 + flag;
- flag = sum/10;
- sum = sum%10;
- if(count == 0) ans.val = sum;
- else {
- ListNode newNode = new ListNode(sum);
- now.next = newNode;
- now = newNode;
- }
- count++;
- if(l1 != null) l1 = l1.next;
- if(l2 != null) l2 = l2.next;
- }
- if(flag != 0) {
- ListNode newNode = new ListNode(flag);
- now.next = newNode;
- now = newNode;
- }
- return ans;
- }
- }
今天是一道中等题。实际上也不算很难,对链表结构有所了解基本上就可以处理。
看完题目。发现,欸,还是加法。这跟前几次的字符串加法,大数加法那些其实都差不多。而且,题目还很贴心,甚至链表都是倒序的。那就不需要再多处理什么,直接相加就行了。但,和字符串加法相同,都会出现两个数长度(位数)不一样的情况,所以需要判断,如果低位加完了,就使用0补高位。由于要返回链表头,所以链表头创建完就不要动了,用now来代替移动。只要l1或l2没有结束,就说明还要继续处理,进循环之后先判断,如果l1(l2)是空的,说明已经加完了,之后的位数需要使用0来补足。后面就是常规的计算了。加上前一位的进位就可以计算出这个位相加的结果。使用/10%10的基本操作来判断进位和余数。最后,如果加完flag还有数值,就说明有高进位,再处理一次就行了。(因为加法不可能产生n+2位数)。
虽说是中等题,实际上不难,大家争取拿下。如果有更好的解法也可以发在评论区。