一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
一、题目描述:
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例1:
输入:l1 = [7,2,4,3], l2 = [5,6,4] 输出:[7,8,0,7] 示例2:
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[8,0,7] 示例3:
输入:l1 = [0], l2 = [0] 输出:[0]
提示:
链表的长度范围为 [1, 100] 0 <= node.val <= 9 输入数据保证链表代表的数字无前导 0
进阶:如果输入链表不能修改该如何处理?换句话说,不能对列表中的节点进行翻转。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lM…
二、思路分析:
注意考虑到整数有可能溢出 ,链表的长度页不相同。 将两个链表分别反转 反转之后的链表的头节点表示个位数,尾节点表示最高位;从两个链表的头节点开始相加,就相当于从整数的个位数开始相加 要注意进位,如果两个整数的个位数相加的和超过10,就会往十位数产生一个进位,在下一步做十位数相加时就要把这个进位考虑进去
三、AC 代码:
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
l1=reverseList(l1);
l2=reverseList(l2);
ListNode newnode=addList(l1,l2);
newnode=reverseList(newnode);
return newnode;
}
public ListNode addList(ListNode l1,ListNode l2){
ListNode dummy=new ListNode(0);
ListNode sumnode=dummy;
int count=0;
while(l1!=null || l2!=null){
int sum=(l1==null?0:l1.val)+(l2==null?0:l2.val)+count;
count=sum>=10?1:0;
sum=sum>=10?sum-10:sum;
ListNode node=new ListNode(sum);
sumnode.next=node;
sumnode=sumnode.next;
if(l1!=null) l1=l1.next;
if(l2!=null) l2=l2.next;
}
if(count>0){
sumnode.next=new ListNode(count);
}
return dummy.next;
}
public ListNode reverseList(ListNode head){
ListNode pre=null;
ListNode node=head;
while(node!=null){
ListNode temp=node.next;
node.next=pre;
pre=node;
node=temp;
}
return pre;
}
}
四、总结:
掘友们,解题不易,如果觉得有用就留下个赞或评论再走吧!谢啦~ 💐