题目如下:
You are given two linked lists representing two non-negative numbers. 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.
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
解题思路:这里实现的代码比较繁琐,使用了二表合并的思想,先对两个表等长的部分加和,然后再对较长的表进行操作。
提交代码:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
if(l1 == null || l2 == null){
System.err.println("list node is null!");
return null;
}
int flag = 0; // 标识,是否进位
ListNode node = null; // 操作表
int value1 = l1.val;
int value2 = l2.val;
int value = value2 + value1; //对两个表同位的数求和
if(value < 10){
node = new ListNode(value);
}else{
node = new ListNode(value - 10);
flag = 1;
}
ListNode head = node; //表头,需要返回的表
while(true){ // 对两表同位的数进行操作
if(l1.next == null || l2.next == null){
break;
}
l1 = l1.next;
l2 = l2.next;
value1 = l1.val;
value2 = l2.val;
if(flag == 0){
value = value1 + value2;
}else{
value = value1 + value2 + 1;
}
if(value < 10){
node.next = new ListNode(value);
flag = 0;
}else{
node.next = new ListNode(value - 10);
flag = 1;
}
node = node.next;
}
while(l1.next != null){ //如果l1较长
l1 = l1.next;
if(flag == 1){
if(l1.val + 1 < 10){
node.next = new ListNode(l1.val + 1);
flag = 0;
}else{
node.next = new ListNode(l1.val + 1 - 10);
flag = 1;
}
}else{
node.next = new ListNode(l1.val);
}
node = node.next;
}
while(l2.next != null){ //如果l2较长
l2 = l2.next;
if(flag == 1){
if(l2.val + 1 < 10){
node.next = new ListNode(l2.val + 1);
flag = 0;
}else{
node.next = new ListNode(l2.val + 1 - 10);
flag = 1;
}
}else{
node.next = new ListNode(l2.val);
}
node = node.next;
}
if(flag == 1){ //如果有进位,补上最高位
node.next = new ListNode(1);
node = node.next;
}
node.next = null;
return head;
}