兩數之和的演算法問題 演算法問題 ,演算法面試題兩數之和, 面試題兩數相加
阿新 • • 發佈:2021-01-25
技術標籤:java 後端演算法後端演算法連結串列資料結構java
1.這是原題目:
給你兩個非空 的連結串列,表示兩個非負的整數。它們每位數字都是按照逆序的方式儲存的,並且每個節點只能儲存一位數字。
請你將兩個數相加,並以相同形式返回一個表示和的連結串列。
你可以假設除了數字 0 之外,這兩個數都不會以 0開頭。
分析題目:
1.提議:就是讓你求兩個連結串列對應位,數字相加的結果。(注意:數字相加要考慮進位)
2 思路:1)連結串列是按逆序排列的,可以把兩個連結串列的改正為正序,然後兩個數相加之和按逆序的方式插入到新的連結串列就是對應的結果
2)還有一種的就是,迴圈取連個連結串列的第一位相加,把它門的除10的商放到進位,(簡單點就是 個、十、百、千......)配個圖就明白了:
寫段程式碼模擬一下:
public static void main(String[] args) { // 建立兩個連結串列陣列 LinkedList l1 = new LinkedList(); l1.add(2); l1.add(6); l1.add(8); System.out.println(l1); LinkedList l2 = new LinkedList(); l2.add(6); l2.add(5); l2.add(3); System.out.println(l2); // 新建連結串列陣列做結果集 LinkedList l3 = new LinkedList(); // 設定進位標識 int carry = 0; while (!l1.isEmpty()||!l2.isEmpty()|| carry!=0){//表示有一個數據不null或0時繼續迴圈 // 因為有可能取到null,所以就這麼寫一下 Object val1 = l1.pollFirst(); int val11 = val1!=null?Integer.valueOf(val1.toString()):0; System.out.println(val11+" val11"); Object val2 = l2.pollFirst(); int val22 = val2!=null?Integer.valueOf(val2.toString()):0; System.out.println(val22+" val22"); // 算出對應位相加與進位相加之和 int sum = val11+val22+carry; // 算出進位 carry = sum/10; // 把對應位商放入到結果集 l3.addLast(sum%10); } System.out.println(l2); System.out.println(l3); }
輸出結果:時間複雜度(O(n))
[2, 6, 8]
[6, 5, 3]
2 val11
6 val22
6 val11
5 val22
8 val11
3 val22
0 val11
0 val22
[]
[8, 1, 2, 1]