You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Input: l1 = [0], l2 = [0]
Output: [0]
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
The number of nodes in each linked list is in the range [1, 100].
0 <= Node.val <= 9
It is guaranteed that the list represents a number that does not have leading zeros.
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode sumNode=new ListNode();
ListNode head=null;
int upper=0;
int sum=0;
while(l1!=null && l2!=null){
//sumNode=new ListNode();
if(head==null){
head=sumNode;
}else{
sumNode.next=new ListNode();
sumNode=sumNode.next;
// 아래와 같이 사용하면, sumNode이 null 주소를 가리키게 되고, null 주소에 새로운 object를 할당시키는게 아니고
// 새로 생성한(new ListNode())에 할당하게 되어 sumNode가 sumNode.next와 다른 주소를 가리키게됨. 기존 sumNode와 연결이 끊어진 새로운 object를 생성하게 되는 것.
// System.out.println("here head 2: " +System.identityHashCode(head)); 이용해서 메모리 주소 확인
// sumNode= sumNode.next
// sumNode= new ListNode();
}
sum=l1.val+l2.val+upper;
sumNode.val=sum%10;
//System.out.println("here 1: " +sumNode.val);
upper=sum /10; // 소수점 이하 절사
l1=l1.next;
l2=l2.next;
}
while(l1!=null){
sumNode.next=new ListNode();
sumNode=sumNode.next;
sum=l1.val+upper;
sumNode.val=sum%10;
upper=sum /10; // 소수점 이하 절사
l1=l1.next;
}
while(l2!=null){
sumNode.next=new ListNode();
sumNode=sumNode.next;
sum=l2.val+upper;
sumNode.val=sum%10;
upper=sum /10; // 소수점 이하 절사
l2=l2.next;
//sumNode=new ListNode();
}
if(upper>0){
sumNode.next=new ListNode();
sumNode=sumNode.next;
sumNode.val=upper;
}
return head;
}
}