/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ classSolution{ public ListNode addTwoNumbers(ListNode l1, ListNode l2){ ListNode p = l1; ListNode q = l2; ListNode l3 = new ListNode(); ListNode r = l3;
//定义一个表示是否有进位的布尔值 boolean flag = false;
while (p != null && q != null){ //有进位就要将结果加一 int res = p.val + q.val; if (flag){ res = p.val + q.val + 1; flag = false; } //如果结果大于10表明下一次计算需要进位 if (res >= 10){ res = res - 10; flag = true; } r.val = res; //所有同时往后移动 p = p.next; q = q.next; //这个判断一定要加,不然直接默认r.val为0 if(p != null && q != null){ r.next = new ListNode(); r = r.next; } } //最后肯定有一个是空的,把非空的链表依次赋值给l3 if (p != null || q != null){ //将r再往后移动一格 r.next = new ListNode(); r = r.next; while (p != null){ int res=p.val; //有进位就要将结果加一 if (flag){ res = p.val + 1; flag = false; } //如果结果大于10表明下一次计算需要进位 if (res >= 10){ res = res - 10; flag = true; } r.val = res; //所有同时往后移动 p = p.next; if(p != null){ r.next = new ListNode(); r = r.next; } } while (q != null){ //有进位就要将结果加一 int res=q.val; if (flag){ res = q.val + 1; flag = false; } //如果结果大于10表明下一次计算需要进位 if (res >= 10){ res = res - 10; flag = true; } r.val = res; //所有同时往后移动 q = q.next; if(q != null){ r.next = new ListNode(); r = r.next; } } } //如果还有进位,直接继续赋值1 if(flag){ r.next = new ListNode(); r = r.next; r.val = 1; } return l3; } }
代码复杂度分析
时间复杂度:代码进行了两次for循环,因此时间复杂度是O(n²)
空间复杂度:开辟了两个单元的数组res保存结果,空间复杂度为O(1)
官方解题过程
思路
先用for循环遍历数组,将nums[i]作为第一个数值
如果再去遍历一次数组来找另一个值效率太低,选择引用查找效率极高的哈希表来找第二个值
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution{ publicint[] twoSum(int[] nums, int target) { Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { map.put(nums[i], i); } for (int i = 0; i < nums.length; i++) { int complement = target - nums[i]; //注意i不能重复,所以&&后面的代码要加上 if (map.containsKey(complement) && map.get(complement) != i) { returnnewint[] { i, map.get(complement) }; } } thrownew IllegalArgumentException("No two sum solution"); } }