源码+注释:
class solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return count(l1,l2);
}
private ListNode count(ListNode root1,ListNode root2){
ListNode tempNode1 = root1;
ListNode tempNode2 = root2;
int flag = 1;//flag为1则root1为主链,否则root2为主链
//这个while循环用来判断那个链表比较长,那个链表长,我们就将其作为主链,将另外一条链的数据这和到主链进行返回
while(tempNode1 != null || tempNode2 != null){
//判断条链作为结果链返回
if(tempNode1.next == null && tempNode2.next == null){
flag = 1;
//在while循环将要结束时,我们需要再次将tempNode1和tempNode2执行两个链表的根节点,以便后续对这两个链表的使用
tempNode1 = root1;
tempNode2 = root2;
break;
} else if(tempNode1.next == null){
flag = 2;
tempNode1 = root1;
tempNode2 = root2;
break;
}else if(tempNode2.next == null){
flag = 1;
tempNode1 = root1;
tempNode2 = root2;
break;
}else{
tempNode1 = tempNode1.next;
tempNode2 = tempNode2.next;
}
}
//根据不同的主链进行不同的处理
if(flag == 1){
while(tempNode2 != null){
int sum = tempNode1.val+tempNode2.val;
//递归进位
carry(tempNode1,sum);
//链表前进
tempNode2 = tempNode2.next;
tempNode1 = tempNode1.next;
}
return root1;
}else{
while(tempNode1 != null){
int sum = tempNode2.val+tempNode1.val;
carry(tempNode2,sum);
//链表前进
tempNode2 = tempNode2.next;
tempNode1 = tempNode1.next;
}
return root2;
}
}
//递归进位
private void carry(ListNode node,int data){
ListNode temp = node;
if(data<10){
temp.val = data;
}else{
temp.val = data%10;
if(temp.next != null){
//递归进位
carry(temp.next,temp.next.val+data/10);
}else{
//如果temp.next为空,则代表当前进位数+下一个节点的数肯定小于十所以,直接创建一个节点,保存当前进位数即可
temp.next = new ListNode(data/10);
}
}
}
/**
//自定义测试方法
public static void main(String[] args) {
solution s = new solution();
ListNode root1 = new ListNode(9);
root1.next=new ListNode(9);
root1.next.next = new ListNode(9);
ListNode root2 = new ListNode(1);
root2.next=new ListNode(1);
root2.next.next = new ListNode(1);
ListNode resultNode = s.addTwoNumbers(root1,root2);
while(resultNode!=null){
System.out.print(resultNode.val);
resultNode = resultNode.next;
}
}
*/
}
本段代码的亮点就是没有引入第三个链表,节省了空间,加上递归进位,使得代码简单易懂。
本代码纯个人手写,如有不足之处,还望见谅!