/**
- 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 contain a single digit. Add the two numbers and return it as a linked list.
- You may assume the two numbers do not contain any leading zero, except the number 0 itself.
- Example:
- Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
- Output: 7 -> 0 -> 8
- Explanation: 342 + 465 = 807.
*/
目前网上方案都是添加新listNode为结果集, 做了一个以原来listNode为结果集的方案。可以节省一个1/3的空间复杂度。
public class AddTwoNumbers {
public static void main(String[] args){
System.out.println("hello");
ListNode list1 = createList(342);
ListNode list2 = createList(465);
ListNode result = addTwoNumbers(list1, list2);
ListNode p = result;
while (p != null){
System.out.print(p.val);
p = p.next;
}
System.out.println("hello");
}
static ListNode addTwoNumbers(ListNode list1, ListNode list2){
ListNode p=list1,q=list2, flag = null, preP = p;
int carry = 0;
while (p!=null || q!=null){
if (p!=null){
carry += p.val;
}
if (q != null){
carry += q.val;
}
if (p == null){
flag = q;
}else if (q==null){
flag = p;
}
if (carry <10){
if (flag == null){
p.val = carry;
q.val = carry;
}else{
flag.val = carry;
}
carry = 0;
}else {
int temp = carry % 10;
carry = carry / 10;
if (flag == null){
p.val = temp;
q.val = temp;
}else{
flag.val = temp;
}
}
if (p!= null){
preP = p;
p = p.next;
}
if (q != null){
q = q.next;
}
}
if (flag == preP){
return list1;
}else {
return list2;
}
}
static ListNode createList(Integer number){
ListNode head = new ListNode(-1);
ListNode p = head;
while (number > 0){
int temp = number % 10;
p.next = new ListNode(temp);
p = p.next;
number = (number - temp) / 10;
}
head = head.next;
return head;
}
}
class ListNode
{
int val;
ListNode next;
public ListNode(int x){
val=x;
}
}