题目
理解
两条链表都是逆序存储,所以直接从左向右依次相加
可以利用下面的加法算式来帮助理解,通常习惯是从最右边开始算起,也就是个位、十位、百位这样的顺序。题目是逆序存储,左边第一个是个位,左边第二个是十位,向下以此类推,所以要从左边开始算起。
因为要返回新链表,所以先创建一个傀儡节点,来帮助创建新链表,再创建一个当前节点cur来在新链表上移动,最后,返回傀儡节点的下一个节点即可。
需要注意的是,如果是图片右侧这种情况,即使链表最后没有节点,但最后两位相加大于十,也要记得为这个进位增加一个节点。
图解
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode newListNode = new ListNode(-1);
ListNode cur = newListNode;
int i = 0;
while(l1 != null || l2 != null){
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
int sum = i > 0 ? (val1 + val2 + 1) : (val1 + val2);
i = sum >=10 ? 1: 0;
ListNode n = new ListNode(sum%10);
cur.next = n;
cur = cur.next;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
if(i > 0){
//创建val=1的节点,因为进位最多进一位(9+9=18 < 20),
cur.next = new ListNode(1);
}
return newListNode.next;
}
}
时间复杂度:O(max(m,n));
空间复杂度:O(1)。
看到此处即是情,别忘记点个赞哦。如果有其他问题,欢迎评论,共同探讨!!!