链表节点可以直接运算,无需借用下标。
为了避免大数问题,每个位数独立相加。
问题变成了遍历链表的简单问题。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root = new ListNode(0);
ListNode cursor = root;
//进位变量
int carry = 0;
//遍历链表
while(l1 != null || l2 != null || carry != 0) {
//因为是链表,所以同位置数字可以直接相加
int l1Val = l1 != null ? l1.val : 0;
int l2Val = l2 != null ? l2.val : 0;
int sumVal = l1Val + l2Val + carry;
//如果有进位,意味着sum%10不等于0,也意味着sum/10结果大于0
carry = sumVal / 10;
//尾插法,利用新链表保存运算结果
ListNode sumNode = new ListNode(sumVal % 10);
cursor.next = sumNode;
cursor = sumNode;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
return root.next;
}
}
运行结果: