题目
原链接: https://leetcode.cn/problems/add-two-numbers/
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0开头。
示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.输入: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]
概述:两个链表, 对应的位置进行相加, 满10则进位, 即下一对数值相加时, 加上进位值
a = [2,4,3], b = [5,6,4]
2+5 =7
4+6 = 10 保存0 向下一组进1
3+4+1(进位值)=8
结果: 708
思路: 链表位数可能不同, 可以假设空的位置为0, 这样就可以进行相加; 注意最后多出的余数,没有相加组了,要补上元素
解法
class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}@Overridepublic String toString() {return "ListNode{" +"val=" + val +", next=" + next +'}';}}
@Test
public void test() {
ListNode listNode1 = new ListNode(2, new ListNode(4, new ListNode(3)));
ListNode listNode2 = new ListNode(5, new ListNode(6, new ListNode(7)));
System.out.println(addTwoNumbers(listNode1, listNode2));
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
System.out.println(l1);
System.out.println(l2);
ListNode resultNode = null;
ListNode currentNode = new ListNode();
int carry = 0;
while (l1 != null || l2 != null) {
// 长度不够 当成0
if (l1 == null) {
l1 = new ListNode(0);
}
if (l2 == null) {
l2 = new ListNode(0);
}
// 相加
int number = l1.val + l2.val + carry;
System.out.println(l1.val + " " + l2.val + "进位:" + carry);
// 进位数
carry = number / 10;
// 当前位置的数值 取余数
int remainder = number % 10;
if (resultNode == null) {
resultNode = new ListNode(remainder);
currentNode = resultNode;
} else {
currentNode.next = new ListNode(remainder);
currentNode = currentNode.next;
}
l1 = l1.next;
l2 = l2.next;
}
if (carry > 0) {
currentNode.next = new ListNode(carry);
}
return resultNode;
}
