Q:
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.
A:
以下解法和代碼沒有借閱以往任何資料,如果有更好的解法請在評論區留言
他的意思大致是給你兩個非負數鏈表,每個鏈表代表一個數字,這個數字的每一位都倒敘排列並每個節點含有一個數字,把兩個數字相加並返回鏈表。
無非就是把兩個連接相加一下,其中可能牽扯到進位的問題,也是在鏈表的結尾處進位,本身也沒有什麼好優化的點。但是有兩種解決問題的辦法。
1、把鏈表轉化成long相加之後再轉化成鏈表
2、在鏈表的基礎上做相加
我認爲1之間做了太多無謂的轉換比較浪費時間直接做2,2中又可以劃分爲:
1、把鏈表中倒敘的數字正過來
2、直接改變數字的進位效果,向後進位。
我選擇了2因爲效率高啊,代碼如下:
public class AddTwoNumbers {
public static void main(String[] args){
LinkedList link1 = new LinkedList();
link1.addLast(1);
link1.addLast(2);
LinkedList link2 = new LinkedList();
link2.addLast(1);
link2.addLast(9);
link2.addLast(2);
LinkedList resultLink = addTwoNumbers(link1, link2);
for(Object i : resultLink){
System.out.println(""+(int)i);
}
}
public static LinkedList addTwoNumbers(LinkedList link1,LinkedList link2){
int maxLength = 0;
int minLength = 0;
LinkedList resultLink = null;//結果鏈表
int carry = 0;
if(link1.size()>link2.size()){
resultLink = link1;
maxLength = link1.size();
minLength = link2.size();
}
else {
resultLink = link2;
maxLength = link2.size();
minLength = link1.size();
}
for(int i =0;i<minLength;i++){
carry = 0;
int result = (int)link1.get(i)+(int)link2.get(i)+carry;
if(result>=10){//進位
carry = (int)result/10;
if(i==minLength-1){//超出了鏈表長度
if(i<maxLength-1){//沒有超出最長,不用加位置
resultLink.set(i+1, (int)resultLink.get(i+1)+carry);
}else {//超出最長需要加鏈表長度
resultLink.addLast(carry);
}
}
resultLink.set(i, result%10);
}else {//不進位
resultLink.set(i, result);
}
}
return resultLink;
}
}