两数相加
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序 的方式存储的,并且每个节点只能存储一位数字。
链表结构
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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; } }
|
解题思路
两个链表分为存储了两个数,存储方式为按照逆序存储。
即每个链表的头部节点,即为每个数的个位数。
而两个数相加,正好是从个位数开始相加。
所以我们可以遍历两个链表,对每个链表节点的数进行相加操作,将相加出来的结果存储在一个链表中即可。
注意点
进位:两个数相加,相加结果可能会发生进位,可以通过 /
运算符获取进位值,通过 %
运算符获取当前位值。
高位不足:两个数相加,如果两个数的位数不一致,位数小的可能会发生高位不足的情况,这时可以使用 0
补足。
值为null
:如果两个相加的数链表中有一个值为 null
,则需要注意。
解题代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode dummyHead = new ListNode(0); ListNode p = dummyHead; ListNode p1 = l1, p2 = l2; int carry = 0; int sum = 0; while (p1 != null || p2 != null || carry > 0) { sum = (p1 == null ? 0 : p1.val) + (p2 == null ? 0 : p2.val) + carry; carry = sum / 10; p.next = new ListNode(sum % 10); p1 = p1 == null ? null : p1.next; p2 = p2 == null ? null : p2.next; p = p.next; } return dummyHead.next; }
|