题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
题解
这个题用到的是十进制下的进位加法算式。
当两数相加时,如果某一位的结果大于等于10,则在此位上写相加得数的个位,并需要向上一位计1。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public static ListNode addTwoNumbers(ListNode node1, ListNode node2) {
// 将开始结点初始化为返回列表的哑结点,这里也可以是null,如果是null的话,下边记得要判断
ListNode retListNode = new ListNode(0);
ListNode currentListNode = retListNode;
int carry = 0;
int val;
while(node1 != null || node2!= null){
if(node1 == null){
val = node2.val + carry;
node2 = node2.next;
}else if(node2 == null){
val = node1.val + carry;
node1 = node1.next;
}else{
val = node1.val + node2.val + carry;
node1 = node1.next;
node2 = node2.next;
}
if(val > 9){
val = val % 10;
carry = 1;
}else{
carry = 0;
}
currentListNode.next = new ListNode(val);
currentListNode = currentListNode.next;
}
// 这里比较容易漏掉,如果链表加完之后还有进位,则把这一位补上
if(carry == 1){
currentListNode.next = new ListNode(1);
}
return retListNode.next;
}
复杂度分析:
- 时间复杂度:O(max(m,n)),假设 m 和 n 分别表示 node1和 node2的长度,上面的算法最多重复 max(m,n) 次。
- 空间复杂度:O(max(m,n)),新链表的长度最多为 max(m,n) + 1。