LeetCode刷题之两数相加
两数相加(Add Two Numbers)
题目
代码
/**
* @ClassName AddTowNumbers
* @Description TODO 两数相加$
* @Author charlesYan
* @Date 2020/3/10 15:15
* @Version 1.0
**/
public class AddTowNumbers {
//内部静态类
public static class ListNode {
private int val;
private ListNode next;
public ListNode(int x) {
this.val = x;
}
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//非空校验
if (l1 == null && l2 == null) {
return null;
}
//初始化头节点
ListNode dummyNode = new ListNode(0);
//指针
ListNode head = dummyNode;
int addOne = 0;
//判断l1、l2和addOne为空则跳出循环
while (l1 != null || l2 != null || addOne != 0) {
int val1 = l1 == null ? 0 : l1.val;
int val2 = l2 == null ? 0 : l2.val;
int sum = val1 + val2 + addOne;
//取余
head.next = new ListNode(sum % 10);
//指针前进一位,获取最低层next地址
head = head.next;
//取整
addOne = sum/10;
//l1和l2前进一位
if (l1 != null) {
l1 = l1.next;
}
if (l2 != null) {
l2 = l2.next;
}
}
return dummyNode.next;
}
//打印字符串
public static String printListNode(ListNode ln){
StringBuffer sb = new StringBuffer();
while (ln != null) {
sb.append(ln.val);
ln = ln.next;
}
return sb.toString();
}
//测试类
public static void main(String[] args) {
ListNode ln1 = new ListNode(2);
ln1.next = new ListNode(4);
ListNode ln2 = new ListNode(5);
ln2.next = new ListNode(6);
ListNode result = addTwoNumbers(ln1, ln2);
System.out.println(printListNode(result));
}
}
官方解法
-
解题思路
-
算法
-
特殊情况
-
源码
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummyHead = new ListNode(0);
ListNode p = l1, q = l2, curr = dummyHead;
int carry = 0;
while (p != null || q != null) {
int x = (p != null) ? p.val : 0;
int y = (q != null) ? q.val : 0;
int sum = carry + x + y;
carry = sum / 10;
curr.next = new ListNode(sum % 10);
curr = curr.next;
if (p != null) p = p.next;
if (q != null) q = q.next;
}
if (carry > 0) {
curr.next = new ListNode(carry);
}
return dummyHead.next;
}
- 复杂度分析
时间复杂度:O(max(m, n))
假设 m 和 n 分别表示 l1 和 l2 的长度,上面的算法最多重复 max(m,n) 次。
空间复杂度:O(max(m,n))
新列表的长度最多为 max(m,n)+1