You are given two non-empty linked lists representing two non-negative integers. The most significant digit comes first 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.
Follow up:
What if you cannot modify the input lists? In other words, reversing the lists is not allowed.
Example:
Input: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 8 -> 0 -> 7
再次考察使用链表的逆置。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int length1 = getlengthList(l1);
int length2 = getlengthList(l2);
ListNode p1 = reverseList(l1);
ListNode p2 = reverseList(l2);
ListNode h1 = p1;
ListNode h2 = p2;
int plus = 0;
ListNode pre = null;
int sum = 0;
if (length1>=length2){
pre = p1;
while(p1!=null && p2!=null) {
sum = p1.val + p2.val+plus;
//此处如果不引入中间变量sum,就会出错 p1.val = (p1.val + p2.val+plus)%10;
p1.val = sum % 10;
plus = sum/10;
pre = p1;
p1 = p1.next;
p2 = p2.next;
}
while(p1!=null){
sum = p1.val+plus;
p1.val = sum%10;
plus = sum/10;
pre = p1;
p1 = p1.next;
}
}
else{
pre = p2;
while(p1!=null && p2!=null) {
sum = p1.val + p2.val+plus;
p2.val = sum%10;
plus = sum/10;
pre = p2;
p1 = p1.next;
p2 = p2.next;
}
while(p2!=null){
sum = p2.val+plus;
p2.val = sum%10;
plus = sum/10;
pre = p2;
p2 = p2.next;
}
}
if (plus!=0){
ListNode node = new ListNode(plus);
pre.next = node;
node.next = null;
}
if (length1>=length2) return reverseList(h1);
else return reverseList(h2);
}
public ListNode reverseList(ListNode head) {
ListNode pre = null;
ListNode next = null;
while(head!=null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
public int getlengthList(ListNode head) {
int count = 0;
ListNode p = head;
while(p!=null){
count++;
p = p.next;
}
return count;
}
}