描述:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字0之外,这两个数都不会以0开头。
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
输入:l1 = [0], l2 = [0] 输出:[0]
思路一:用链表l1和链表l2从前往后相加,但是相加后满十进一是进到后面,因为题目要求是返回一个逆序的和,这是我们平时两个整数正常相加的唯一区别。
时间复杂度:O(max(m,n)),m,n分别是两个链表的长度。
空间复杂度:O(1)
结点类:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
}
}
完整代码如下:
public ListNode addTwoNumbers(ListNode l1,ListNode l2){
ListNode head = null,tail = null;//创建新的头结点和尾结点
int carry = 0;
while(l1 != null || l2 != null){
int n1 = (l1 != null ? l1.val:0); //结点不为null的话就赋值当前结点的值,否则赋值为零
int n2 = (l2 != null ? l2.val:0);
int sum = n1 + n2 + carry; //从前往后取值相加,carry最初是n1+n2相加的十位上的值
if(head == null){
head = tail = new ListNode(sum%10); //开始head为空,head=tail,并赋值sum%10
}else{
tail.next = new ListNode(sum%10); //head不为空,则直接赋值sum%10
tail = tail.next; //后移一位
}
carry = sum/10; //carry即十位上的值,进制
if(l1 != null){ //如果l1不为null则直接后移一位
l1 = l1.next;
}
if(l2 != null){
l2 = l2.next;
}
}
if(carry>0){ //最后一个进制放最后,千万别忘了。
tail.next = new ListNode(carry);
}
return head;
}
注意点:据说将carry = sum/10; 改成carry = sum > 9 ? 1:0可以更加省时。理由是除法运算比直接比较跟费时,具体没验证。2021-05-28