(一)题目描述
给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
可以假设除了数字 0 之外,这两个数字都不会以零开头。
(2)解题思路
如同正整数的加法一样,两数相加,该进位则进位。
(3)实现代码
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ArrayList<Integer> res = new ArrayList<>();
ListNode head = new ListNode();
ListNode l3=head;
int sum=0,cnt=0,sum_cnt=0,pre1=0,pre2=0;
ListNode p1=l1,p2=l2;
//首先得链表反转
p1=reverseListByLocal(l1);
p2=reverseListByLocal(l2);
//遍历两链表
while (p1!=null&&p2!=null){
sum_cnt=p1.val+p2.val+cnt;
sum=sum_cnt%10;
cnt=sum_cnt/10;
res.add(sum);
p1=p1.next;
p2=p2.next;
}
//剩下的链表p1不为Null
if(p1!=null){
while (p1!=null){
pre1=p1.val+cnt;
sum=pre1%10;
res.add(sum);
cnt=pre1/10;
p1=p1.next;
}
}else {
//剩下p2不为Null
while (p2!=null){
pre2=p2.val+cnt;
sum=pre2%10;
res.add(sum);
cnt=pre2/10;
p2=p2.next;
}
}
//注意!最后可能还有进位
if(cnt!=0){
res.add(cnt);
}
for (int i = res.size()-1; i >=0 ; i--) {
ListNode node=new ListNode(res.get(i));
l3.next=node;
l3=l3.next;
}
l3.next=null;
return head.next;
}
//链表的就地反转(画一个图即可)
public ListNode reverseListByLocal(ListNode listNode){
ListNode resultList = new ListNode(-1);
resultList.next= listNode;
ListNode p = listNode;
ListNode pNext = p.next;
while (pNext!=null){
p.next = pNext.next;
pNext.next = resultList.next;
resultList.next = pNext;
pNext=p.next;
}
return resultList.next;
}
}