import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
// write code here
//特殊值处理,如果链表1为空,则返回链表2
if(head1 == null){
return head2;
}
//特殊值处理,如果链表2为空,则返回链表1
if(head2 == null){
return head1;
}
//调用外部接口,先将链表1和链表2反转
head1 = ReverseList(head1);
head2 = ReverseList(head2);
ListNode head0 = null; //创建一个新的链表,用来保存两个链表相加后的结果
ListNode root = head0;
int count = 0; //当前两个节点的十进制数
int count1 = 0; //前两个节点的十进制数
int sum = 0; //两个节点值的和以及前两个节点的十进制数
ListNode temp = null; //链表新增的节点指针
while (head1 != null && head2 != null){//当链表1和链表2都不为空时,两个链表对应的节点相加
count = 0; //更新当前两个节点的十进制数
sum = head1.val + head2.val + count1; //当前两个节点值的和以及前两个节点的十进制数
if(sum > 9){//当和大于9时,需要进十进制
count = 1; //更新当前两个节点的十进制数
sum = sum%10; //更新当前两个节点值的和以及前两个节点的十进制数
}
temp = new ListNode(sum); //创建新增的节点
count1 = count; //更新前两个节点的十进制数
if(head0 == null){//如果是头节点,则指向新创建的节点
head0 = temp;
root = head0;//保存新创建的链表的头指针,后续需要反转该链表
}else {//如果不是头节点,则它的后继节点指向新创建的节点,
head0.next = temp;
head0 = head0.next;//并且移动当前节点head0,head0保证永远指向链表的尾节点
}
head1 = head1.next;//链表1节点移动
head2 = head2.next;//链表2节点移动
}
while (head1 != null){//当链表1不为空时,此时链表2为空,只需要将链表1节点值与前两个节点的十进制数相加即可
count = 0; //更新当前两个节点的十进制数
sum = head1.val+count1; //链表1节点值与前两个节点的十进制数相加
if(sum > 9){
count = 1;
sum = sum%10;
}
temp = new ListNode(sum);
count1 = count;
head0.next = temp;
head0 = head0.next;
head1 = head1.next;
}
while (head2 != null){//当链表2不为空时,此时链表1为空,只需要将链表2节点值与前两个节点的十进制数相加即可
count = 0; //更新当前两个节点的十进制数
sum = head2.val+count1; //链表2节点值与前两个节点的十进制数相加
if(sum > 9){
count = 1;
sum = sum%10;
}
temp = new ListNode(sum);
count1 = count;
head0.next = temp;
head0 = head0.next;
head2 = head2.next;
}
//当链表1和链表2都为空时,如果前两个节点的十进制数大于0,则还需要新创建一个节点,保存十进制数
if(count1 > 0 ){
temp = new ListNode(count1);
head0.next = temp;
count1 = 0;//将十进制数变为0
}
root = ReverseList(root);
return root;
}
public static ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){//特殊值处理,空链表,或者链表的长度为1
return head;
}
ListNode prep = null; //保存当前节点的前驱节点
ListNode next = head.next; //保存当前节点的后继节点
while (head != null){//遍历链表,head指向当前遍历的链表节点
next = head.next; //保存当前节点的后继节点
head.next = prep; //实现链表方向反转
prep = head; //前驱节点后移
head = next; //当前节点后移
}
return prep;//返回链表反转后的头指针
}
}
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head1 ListNode类
* @param head2 ListNode类
* @return ListNode类
*/
public ListNode addInList (ListNode head1, ListNode head2) {
// write code here
//特殊值处理,如果链表1为空,则返回链表2
if(head1 == null){
return head2;
}
//特殊值处理,如果链表2为空,则返回链表1
if(head2 == null){
return head1;
}
//调用外部接口,先将链表1和链表2反转
head1 = ReverseList(head1);
head2 = ReverseList(head2);
ListNode head0 = null; //创建一个新的链表,用来保存两个链表相加后的结果
ListNode root = head0;
int count = 0; //当前两个节点的十进制数
int count1 = 0; //前两个节点的十进制数
int sum = 0; //两个节点值的和以及前两个节点的十进制数
ListNode temp = null; //链表新增的节点指针
while (head1 != null && head2 != null){//当链表1和链表2都不为空时,两个链表对应的节点相加
count = 0; //更新当前两个节点的十进制数
sum = head1.val + head2.val + count1; //当前两个节点值的和以及前两个节点的十进制数
if(sum > 9){//当和大于9时,需要进十进制
count = 1; //更新当前两个节点的十进制数
sum = sum%10; //更新当前两个节点值的和以及前两个节点的十进制数
}
temp = new ListNode(sum); //创建新增的节点
count1 = count; //更新前两个节点的十进制数
if(head0 == null){//如果是头节点,则指向新创建的节点
head0 = temp;
root = head0;//保存新创建的链表的头指针,后续需要反转该链表
}else {//如果不是头节点,则它的后继节点指向新创建的节点,
head0.next = temp;
head0 = head0.next;//并且移动当前节点head0,head0保证永远指向链表的尾节点
}
head1 = head1.next;//链表1节点移动
head2 = head2.next;//链表2节点移动
}
while (head1 != null){//当链表1不为空时,此时链表2为空,只需要将链表1节点值与前两个节点的十进制数相加即可
count = 0; //更新当前两个节点的十进制数
sum = head1.val+count1; //链表1节点值与前两个节点的十进制数相加
if(sum > 9){
count = 1;
sum = sum%10;
}
temp = new ListNode(sum);
count1 = count;
head0.next = temp;
head0 = head0.next;
head1 = head1.next;
}
while (head2 != null){//当链表2不为空时,此时链表1为空,只需要将链表2节点值与前两个节点的十进制数相加即可
count = 0; //更新当前两个节点的十进制数
sum = head2.val+count1; //链表2节点值与前两个节点的十进制数相加
if(sum > 9){
count = 1;
sum = sum%10;
}
temp = new ListNode(sum);
count1 = count;
head0.next = temp;
head0 = head0.next;
head2 = head2.next;
}
//当链表1和链表2都为空时,如果前两个节点的十进制数大于0,则还需要新创建一个节点,保存十进制数
if(count1 > 0 ){
temp = new ListNode(count1);
head0.next = temp;
count1 = 0;//将十进制数变为0
}
root = ReverseList(root);
return root;
}
public static ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){//特殊值处理,空链表,或者链表的长度为1
return head;
}
ListNode prep = null; //保存当前节点的前驱节点
ListNode next = head.next; //保存当前节点的后继节点
while (head != null){//遍历链表,head指向当前遍历的链表节点
next = head.next; //保存当前节点的后继节点
head.next = prep; //实现链表方向反转
prep = head; //前驱节点后移
head = next; //当前节点后移
}
return prep;//返回链表反转后的头指针
}
}