题目
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
翻译
翻译: 给你两个表示两个非负数字的链表。数字以相反的顺序存储,其节点包含单个数字。将这两个数字相加并将其作为一个链表返回。
输入: (2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
先上我冗余度超高的代码,后面有时间再改
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode l = new ListNode(0), p1 = l1, p2 = l2, r = l;
int temp = 0;
while (p1 != null && p2 != null) {
ListNode t = new ListNode(0);
int val = p1.val + p2.val + temp;
if (val > 9) {
t.val = val % 10;
temp = 1;
} else {
t.val = val;
temp = 0;
}
l.next = t;
l = t;
p1 = p1.next;
p2 = p2.next;
}
while (temp == 1) {
if (p1 != null) {
int val = p1.val + temp;
if (val > 9) {
temp = 1;
} else {
temp = 0;
}
p1.val = val % 10;
l.next = p1;
l = p1;
p1 = p1.next;
} else if (p2 != null) {
int val = p2.val + temp;
if (val > 9) {
temp = 1;
} else {
temp = 0;
}
p2.val = val % 10;
l.next = p2;
l = p2;
p2 = p2.next;
} else {
l.next = new ListNode(1);
temp = 0;
}
}
if (p1 != null) {
l.next = p1;
}
if (p2 != null) {
l.next = p2;
}
return r.next;
}
题目的可视化描述:
测试用例 | 预期结果 |
---|---|
l1=[0,1] l2=[0,1,2] | [0,1,2] |
l1=[] l2=[0,1] | [0,1] |
l1=[9,9] l2=[1] | [0,0,1] |
伪代码:
- 初始化当前节点为空链表头
- 初始化 carry 为 0 .
- 将
p 和 q 分别初始化指向l1 和 l2 的头部 - 遍历
l1
和
l2
直到端点:
- 将
x
设置为节点
p 的值。如果 p 到达l1 的末尾,设 x 为0 。 - 将
y
设置为节点
q 的 值。如果 q 到达l2 的末尾,设 y 为0 。 - 计算 sum=x+y+carry 。
- 更新 carry=sum/10 。
- 创建个新节点,值为 summod ,并让其成为当前节点的下一节点,推进当前节点。
- 推进
p
和
q 。
- 将
x
设置为节点
- 检查是否有 carry=1 , 是就将一个值为1的新节点添加到链表结尾。
- 返回虚拟头的next节点
参考算法:
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;
}
复杂度分析:
假设
l1
,
l2
长度分别是
m
和
时间复杂度:
O(max(m,n))
空间复杂度:
O(max(m,n))
新链表长度最多为
max(m,n)+1