问题描述: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
其实我发现,对于我来说,读懂题目就是问题所在:给你两个linked lists,代表两个倒序(如数字1234,给你的形式是4->3->2->1这样的序列)的数,让他们相加,结果也是返回一个linked lists。
问题是 进位和不同长度的两个数字相加。下面是我的代码,不当之处多多批评:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
//num1用来接收第一个list1的值。
//num2用来接收第二个list2的值。
//l3用来指向最终的list头结点
//l4用来修改list的next指针
//flag是判断进位标志
int num1 = l1.val;
int num2 = l2.val;
ListNode l3 = new ListNode((num1+num2)%10);
ListNode l4 = l3;
ListNode l;
int flag = 0;
//首先,判断是否进位
if (num1+num2>9) {
flag = 1;
}
//两个list都没有到达结尾
while(l1.next != null && l2.next != null){
//新建节点
l = new ListNode(0);
//l4的next指向节点
l4.next = l;
//l4指向节点
l4 = l;
//如果需要进位,在此加一,并把flag归位。
if (flag == 1) {
l.val =1;
flag = 0;
}
//l1和l2分别取下一个数据
l1 = l1.next;
l2 = l2.next;
num1 = l1.val;
num2 = l2.val;
//判断是否需要进位
if (l.val + num1+num2>9) {
flag = 1;
}
//赋值
l.val = (l.val + num1+num2)%10;
}
//如果同时到了结尾
if(l1.next == null && l2.next == null){
//需要进位,新建node,赋值,结束。
if (flag == 1) {
l = new ListNode(1);
l4.next = l;
}
return l3;
}
//l2到了结尾,l1还要继续
if(l1.next != null){
//新建节点,处理节点,处理进位
l = new ListNode(0);
l4.next = l;
l4 = l;
if (flag == 1) {
l.val =1;
flag = 0;
}
//取l1的下一个数据
l1 = l1.next;
num1 = l1.val;
//判断是否进位
if ((l.val + num1)> 9) {
flag = 1;
}
//赋值
l.val = (l.val + num1)%10;
//处理剩下的节点
while (l1.next != null) {
l = new ListNode(0);
l4.next = l;
l4 = l;
if (flag == 1) {
l.val =1;
flag = 0;
}
l1 = l1.next;
num1 = l1.val;
if ((l.val + num1)> 9) {
flag = 1;
}
l.val = (l.val + num1)%10;
}
//所有节点处理完毕,判断是否进位
if (flag == 1) {
l = new ListNode(0);
l4.next = l;
l.val =1;
}
//返回结果
return l3;
}
//l1到达结尾,l2需要处理,同理,不再做解释
if(l2.next != null){
l = new ListNode(0);
l4.next = l;
l4 = l;
if (flag == 1) {
l.val =1;
flag = 0;
}
l2 = l2.next;
num2 = l2.val;
if ((l.val + num2)> 9) {
flag = 1;
}
l.val = (l.val + num2)%10;
while (l2.next != null) {
l = new ListNode(0);
l4.next = l;
l4 = l;
if (flag == 1) {
l.val =1;
flag = 0;
}
l2 = l2.next;
num2 = l2.val;
if ((l.val + num2)> 9) {
flag = 1;
}
l.val = (l.val + num2)%10;
}
if (flag == 1) {
l = new ListNode(0);
l4.next = l;
l.val =1;
}
}
return l3;
}