2.两数相加
题目描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
思路
- 将长度较短的链表在后面添0,使长短两个链表长度相等。
- 遍历两个链表,逐位相加并将结果赋值在某个链表中,并用变量
t
来记录进位。 - 当指针指向链表的最后一个结点时,如果此时
t=1
,说明仍有进位,则需要新建一个结点,并将t
赋值给新结点的值。 - 返回结果链表的头结点。
代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p = l1;
ListNode q = l2;
int t = 0, x = 0;
//先对短的链表进行某位补零
while(p.next != null || q.next != null){
if(p.next != null && q.next == null){
ListNode u = new ListNode(0);
q.next = u;
}
else if (p.next == null && q.next != null){
ListNode r = new ListNode(0);
p.next = r;
}
p = p.next;
q = q.next;
}
p = l1; q = l2;
while(p != null || q != null){
if(p != null && q != null){
//将指针p的值先赋值给x
x = p.val;
p.val = (p.val + q.val + t)%10;
//t来存储进位信息
t = (x + q.val + t)/10;
}
//如果p指向了队尾,此时跳出循环
if (p.next == null){break;}
p = p.next;
q = q.next;
}
//判断最后是否进位,如果进位应当再添加一个结点
if (t==1){
ListNode w = new ListNode(0);
p.next = w;
w.val = t;
}
return l1;
}
}