题目描述:
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:L1 = [2,4,3], L2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807
题意
两个链表转为数字,相加后转为新的链表
思路:
寻找链表中代表个位的位置,从个位开始依次将两个链表相加,模拟数字加法
链表的头结点就是数字的个位,从头结点开始遍历链表,分别相加两个链表中对应的位置,如果其中一个结点为空,则补0。(相加需要考虑进位)
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;
}
}
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = new ListNode();
ListNode h1 = head;
int v = 0; //当前位的值
int c = 0; //进位
ListNode t1 = l1; //不改变原有链表结构
ListNode t2 = l2;
while (t1 != null || t2 != null) {
int a = t1 == null ? 0 : t1.val; //其中一个为空则补0
int b = t2 == null ? 0 : t2.val;
v = (a + b + c) % 10; //当前位的值
c = (a + b + c) / 10; //进位
h1.next = new ListNode(v);
h1 = h1.next;
if (t1 != null) t1 = t1.next;
if (t2 != null) t2 = t2.next;
}
if (c > 0) { //两个链表都为空,是否还有进位
h1.next = new ListNode(c);
}
return head.next;
}