题目
【题目:普通】
给定两个用链表表示的整数,每个节点包含一个数位。
这些数位是反向存放的,也就是个位排在链表首部。
编写函数对这两个整数求和,并用链表形式返回结果。
示例:
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
示例:
输入:(6 -> 1 -> 7) + (2 -> 9 -> 5),即617 + 295
输出:9 -> 1 -> 2,即912
解题思路
就按照正常的数学思路进行解题
- 发现从头结点开始相加刚好符合数学从个位开始的加法
- 每逢满10则将标志位置为1,否则置位0
- 标志位会参加到下个节点的运算
- 【注意】要考虑到可能一个链表到头了,另一个链表还没到头的情况,所以要分三种情况考虑(长度相等,长度不同x2)
- 【注意】如果结束之后发现flag进位符还是1,那么说明还需要进一位,就像999+1=1000,需要再new一个值为1的新节点在链表尾节点。
public class Test {
public static void main(String[] args) {
ListNode head1 = new ListNode(9);
head1.next = new ListNode(9);
head1.next.next = new ListNode(9);
ListNode head2 = new ListNode(1);
ListNode res = solution(head1, head2);
while (res!=null){
System.out.println(res.val);
res = res.next;
}
}
public static ListNode solution(ListNode l1, ListNode l2) {
if (l1 == null && l2 == null) {
return null;
}
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
int flag = 0;
ListNode head = new ListNode(0);
ListNode p = head;
while (l1 != null || l2 != null) {
//如果两个节点都没到尾节点
if (l1 != null && l2 != null) {
p.val = (l1.val + l2.val + flag) % 10;
if ((l1.val + l2.val + flag) >= 10) {
flag = 1;
} else {
flag = 0;
}
l1 = l1.next;
l2 = l2.next;
} else if (l1 == null && l2 != null) {
p.val = (l2.val + flag) % 10;
if ((l2.val + flag) >= 10) {
flag = 1;
} else {
flag = 0;
}
l2 = l2.next;
} else if (l1 != null && l2 == null) {
p.val = (l1.val + flag) % 10;
if ((l1.val + flag) >= 10) {
flag = 1;
} else {
flag = 0;
}
l1 = l1.next;
}
//移动之后再进行判断,如果都为空了,则不再new新的节点了不然会多个0节点。。
/* [2,4,3]+[5,6,4] = [7,0,8,0] */
if (l1 == null && l2 == null){
break;
}
p.next = new ListNode(0);
p = p.next;
}
if (flag == 1){
p.next = new ListNode(1);
}
return head;
}
}
性能:
时间复杂度是O(n)因为用到了一个for,空间复杂度为O(1)
进阶:思考一下,假设这些数位是正向存放的,又该如何解决呢?
- 那么就先使用一个while循环将链表逆转,之后计算
- 因为加法没可能从高位往低位加起