给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807
思路:在创建一个新的链表,然后再新链表中进行操作,需要记录两数和来自前一位的进位,并保存当前位的进位,主要细节有二:一是第一个节点不保存结果,只是存储头节点,二是如果一个链表结束了,另一个仍要继续运算。
public class Main {
// static class ListNode {
// int val;
// ListNode next;
// ListNode(int x) {
// val = x;
// next = null;
// }
// }
public static void main(String[] args) {
ListNode n1 = new ListNode(2);
n1.next=new ListNode(4);
n1.next.next=new ListNode(3);
ListNode n2=new ListNode(5);//B链表
n2.next=new ListNode(6);
n2.next.next=new ListNode(4);
System.out.println(addTwoNumbers(n1,n2).val);
}
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode(0);
ListNode curr=res;
ListNode listA=l1;
ListNode listB=l2;
int flag=0;
while(listA!=null || listB!=null){ 如果一个结束了,另一个继续遍历,这一点比较好
int v1 = (listA == null) ? 0 : listA.val;
int v2 = (listB == null) ? 0 : listB.val;
int ans = v1 + v2 + flag;
if (ans >= 10) {
flag = ans / 10;
ans = ans % 10;
}else {
flag=0;
}
curr.next = new ListNode(ans);
curr = curr.next;
listA = (listA == null) ? listA : listA.next; //如果listA已经为空了,那么还等于
//它本身
listB = (listB == null) ? listB : listB.next;
}
if(flag>0){
curr.next=new ListNode(flag);
}
return res.next;
}
}