lintcode 167 链表求和
你有两个用链表代表的整数,其中每个节点包含一个数字。数字存储按照在原来整数中相反的顺序,使得第一个数字位于链表的开头。写出一个函数将两个整数相加,用链表形式返回和。
样例样例 1:
输入: 7->1->6->null, 5->9->2->null
输出: 2->1->9->null
样例解释: 617 + 295 = 912, 912 转换成链表: 2->1->9->null
样例 2:
输入: 3->1->5->null, 5->9->2->null
输出: 8->0->8->null
样例解释: 513 + 295 = 808, 808 转换成链表: 8->0->8->null
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*
*/
public class Solution {
/**
* @param l1: the first list
* @param l2: the second list
* @return: the sum list of l1 and l2
*/
public ListNode addLists(ListNode l1, ListNode l2) {
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
// write your code here
ListNode list = new ListNode(0);
ListNode head = list;
//纪录向高位的进位
int carry = 0;
while(l1 != null && l2 != null){
int sum = l1.val + l2.val+carry;
if(sum > 9){
carry = 1;
}else{
carry = 0;
}
list.next = new ListNode(sum % 10);
list = list.next;
l1 = l1.next;
l2 = l2.next;
}
//两条链表长度不想等
if(l2 != null){
while(l2 != null){
//如果没有进位,尾部直接拼接剩余链表
if(carry == 0){
list.next = l2;
return head.next;
}
//否则,val为剩余val+carry
int sum = l2.val+carry;
if(sum > 9){
carry = 1;
}else{
carry = 0;
}
list.next = new ListNode(sum % 10);
list = list.next;
l2 = l2.next;
}
}
if(l1 != null){
while(l1 != null){
if(carry == 0){
list.next = l1;
return head.next;
}
int sum = l1.val+carry;
if(sum > 9){
carry = 1;
}else{
carry = 0;
}
list.next = new ListNode(sum % 10);
list = list.next;
l1 = l1.next;
}
}
if(carry == 1){
list.next = new ListNode(1);
}
return head.next;
}
}