给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字
1.思路:创建链表类,再将数字连成链表。将两串链表传入处理方法中。
难点:处理链表的方法
2.处理思路:补零法,因为链表是从末尾开始取数的,所以当两个链表长度不同时,在高位补零即可。进制处理:定义一个变量carry,将进制数存储在里面。
3.代码: 内联代码片
。
class ListNode{
int val;
ListNode next;
public ListNode() {
super();
}
public ListNode(int val) {
super();
this.val = val;
}
public ListNode(int val, ListNode next) {
super();
this.val = val;
this.next = next;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return " "+val + next ;
}
}
class Solution{
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//创建新链表的虚拟头节点
ListNode newHead = new ListNode(0);
ListNode cur = newHead;
int carry = 0;//保存进值
int sum = 0;//保存结果
while(l1 != null || l2 != null) {
int x = l1 == null ? 0: l1.val;
int y = l2 == null ? 0: l2.val;
sum = x + y + carry;
carry = sum / 10;
sum = sum % 10;
cur.next = new ListNode(sum);
cur = cur.next;//cur后移
if(l1 != null) {
l1 = l1.next;
}
if(l2 != null) {
l2 = l2.next;
}
}
//退出while循环时,判断carry的值
if(carry == 1) {
cur.next = new ListNode(carry);//
}
return newHead.next;
}
}
4.代码手动演示
5.学习心得:看官方答案时没看懂,是在评论里找到的一篇大神写的,本博客仅用于学习记录,如侵犯版权,请及时联系。运行速度很快,击败了百分之99的答案,但内存消耗较大,有时间再去学习空间复杂度低的方法。