解法一:
定义两个移动指针pointer1
和pointer2
,分别指向两个链表,定义一个进位变量index
。在对两个链表逐位相加时,可不分配额外的内存给最终的结果,直接原地更新两个链表的值,最终肯定选长的链表作为最终结果。如果最高位相加还要进一位,还是要额外申请内存给进位。对于长度不相同的链表还是要注意进位。因为要选择更长的链表作为最终结果,所以需要判断移动指针哪个为空哪个不为空,显然是比较复杂的。但是也算是一种解法,我以为可以节省内存,但是在
l
e
e
t
c
o
d
e
leetcode
leetcode上运行时并没有节省内存,相反,内存占用还比较大。具体代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int index = 0;
int val;
ListNode pointer1 = l1, pointer2 = l2;
ListNode temp = null;
while ( pointer1 !=null && pointer2 !=null){
val = pointer1.val + pointer2.val + index;
pointer1.val = val % 10;
pointer2.val = val % 10;
if (val >= 10){
index = 1;
}else{
index = 0;
}
temp = pointer1;
pointer1 = pointer1.next;
pointer2 = pointer2.next;
}
if (index == 0){
if (pointer1 == null)
return l2;
else
return l1;
}else{
if(pointer1 == null && pointer2 == null){
temp.next = new ListNode(1, null);
return l1;
}else if(pointer1 == null){
while(pointer2.next != null){
val = pointer2.val + index;
pointer2.val = val % 10;
if (val >= 10){
index = 1;
}else index = 0;
pointer2 = pointer2.next;
};
val = pointer2.val + index;
pointer2.val = val % 10;
if (val >= 10)
pointer2.next = new ListNode(1, null);
return l2;
}else{
while(pointer1.next != null){
val = pointer1.val + index;
pointer1.val = val % 10;
if (val >= 10){
index = 1;
}else index = 0;
pointer1 = pointer1.next;
};
val = pointer1.val + index;
pointer1.val = val % 10;
if (val >= 10){
pointer1.next = new ListNode(1, null);
}
return l1;
}
}
}
}
解法二:
为得到的结果都新建结点,这种方法更加简单,内存占用还比上面方法要少,最后返回新得到的链表的头结点的下一个结点就可以了。在链表当中,额外新建一个头结点会更加便利链表操作。代码如下:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
int index = 0;
int sum;
ListNode head = new ListNode(-1);
ListNode pointer = head;
while ( l1 !=null || l2 !=null || index!= 0){
sum = 0;
if (l1 != null){
sum = sum + l1.val;
l1 = l1.next;
}
if (l2 != null){
sum = sum + l2.val;
l2 = l2.next;
}
sum = sum + index;
pointer.next = new ListNode(sum % 10);
pointer = pointer.next;
index = sum / 10;
}
head = head.next;
return head;
}
}