题解 | #链表相加(二)#
链表相加(二)
http://www.nowcoder.com/practice/c56f6c70fb3f4849bc56e33ff2a50b6b
/*
* 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) {
ListNode head11 =head1;
ListNode head22 =head2;
int len1 = 0;
int len2 = 0;
//1.首先遍历一次获取链表长度
//作用:1).创建数组时确定数组最大长度2).数组相加时确定加到哪个索引处终止3).确认以哪条长链表作为输出链表
while(head11!=null){
len1++;
head11 = head11.next;
}
while(head22!=null){
len2++;
head22 = head22.next;
}
//2.确认 长短链表长度及对应链表
int maxlen = len1 > len2 ? len1 : len2;
int minlen = len1 == maxlen ? len2 : len1;
ListNode maxNode = maxlen == len1? head1:head2;
ListNode minNode = maxNode == head2? head1:head2;
//3.标记链表头 指针
ListNode res = maxNode;
ListNode resMin = minNode;
//4.创建2 个数组
int[] arr1 = new int[maxlen+1];
int[] arr2 = new int[maxlen+1];
//5链表值存到数组中
int index = 1;
while(maxNode!=null){
arr1[index++] = maxNode.val;
maxNode = maxNode.next;
}
index = 1 + maxlen - minlen;
while(minNode!=null){
arr2[index++] = minNode.val;
minNode = minNode.next;
}
//6数组值相加 进位
for(int i=maxlen;i>(maxlen-minlen);i--){
int temp = arr1[i] + arr2[i];
arr1[i] = temp%10;
int jin = temp/10;
index = i;
while(jin!=0){
index--;
int ttt = arr1[index]+1;
arr1[index] = ttt%10 ;
jin = ttt/10;
}
}
//7选择长链表,及判断数组索引0位值,为0说明输出链表长度与2链表中长链表长度一致
ListNode tt =res;
if(arr1[0] == 0){
index = 1;
while(tt!=null){
tt.val = arr1[index++];
tt = tt.next;
}
}else{
//否则,长链表末尾追加一个节点
index = 0;
while(tt!=null){
tt.val = arr1[index++];
if(tt.next==null){
resMin.val = arr1[maxlen-1];
resMin.next = null;
tt.next = resMin;
break;
}
tt = tt.next;
}
}
return res;
}
}