[LeetCode][2]Add Two Numbers解析 -Java實現

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;
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章