题目:给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路:两数求和,当两数位数相同时,直接求和即可;两个数的位数不同,把位数少的那一个链表的后继结点全部看做0,然后进行链表的相加;
执行流程:
1. 为相加后的链表创建头尾指针,其中头指针固定不动,尾指针用来插入节点
2. 设置初始的进位标志,初始为0
3. 开始循环,当有任何一个链表结点不为空的时候,说明还没有相加完毕,此时继续执行循环
-判断当前的l1和l2节点是否为空,如果为空即为0,否则取当前值
-计算求和和进位标志哦,需要注意次序不能颠倒
-接下来判断如果头结点为空,
-如果头结点不为空,使用尾插法插入节点
-之后进行判断,如果l1和l2有一个不为空,则指向链表的下一个节点
4. 跳出循环后判断进位标志是否为1,如果为1创建一个新的节点加入即可。
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null, tail = null; //head保存头节点
int posion = 0;
while(l1 !=null || l2 != null){
int number1 = l1 != null ? l1.val : 0; //当l1不为null时将值取出来,否则取值为0
int number2 = l2 != null ? l2.val : 0; //当l2不为null时将值取出来,否则取值为0
int sum = number1 + number2 + posion;
posion = sum / 10; //判断是否有进位
int number = sum % 10; //当前要保存的元素
if(head == null){
head = tail = new ListNode(number);
}else{
tail.next = new ListNode(number);
tail = tail.next;
}
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
if(posion == 1){
tail.next = new ListNode(1);
tail = tail.next;
}
return head;
}
}