Q2.两数相加
问题描述
给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
1 2 3
| 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
|
示例 2:
1 2
| 输入:l1 = [0], l2 = [0] 输出:[0]
|
示例 3:
1 2
| 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
|
提示:
- 每个链表中的节点数在范围 [1, 100] 内
- 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
思路
个位 |
十位 |
百位 |
2 |
4 |
3 |
5 |
6 |
4 |
7 |
0 |
8 |
根据上面的例子,这道题的时间复杂度应该是$O(n)$,即对最长链表的一遍遍历:
- 由于节点非空,且数字非负,那么遍历时只要考虑进位,不用回溯。
- 不要直接将字符串转化为数字,Integer和double都是有界的,这道题的数字大小上限会溢出。
代码
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public class AddTwoNumbers { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode root = null; ListNode cursor = null; ListNode pre = null; int step = 0; while(l1 !=null || l2 !=null||step!=0){ int value = add(l1,l2,step); int current = value %10; cursor = new ListNode(current); if(root ==null){ root =cursor; pre = root; }else { pre.next = cursor; pre = pre.next; }
if(value>=10){ step =1; }else { step =0; } if(l1 !=null){ l1 = l1.next; } if(l2 !=null){ l2 = l2.next; } } return root; } private int add(ListNode l1, ListNode l2,int step){ if(l1 == null){ if(l2 ==null){ return step; }else { return l2.val + step; } }else if(l2 == null){ return l1.val+step; }else { return l1.val+l2.val+step; } } }
public class ListNode { int val; ListNode next;
ListNode(int x) { val = x; } }
|