リンクリストの追加
Leetcode のこの質問のリンクはhttps://leetcode-cn.com/problems/add-two-numbers/です。さらに解決策を見たい場合は、Web サイトに直接アクセスできます。侵害がある場合は、お問い合わせください。そして削除してください、ありがとう
2 つの非負の整数を表す 2 つの空ではないリンク リストが与えられます。それぞれの数字は逆の順序で保存され、各ノードは 1 つの数字のみを保存できます。
2 つの数値を加算し、その合計を同じ形式で表すリンク リストを返してください。
どちらの数字もゼロ以外のゼロで始まるとは考えられません。
例 1:
入力: l1 = [2,4,3]、l2 = [5,6,4]
出力: [7,0,8]
説明: 342 + 465 = 807。
例 2:
入力: l1 = [0]、l2 = [0]
出力: [0]
例 3:
入力: l1 = [9,9,9,9,9,9,9]、l2 = [9,9,9,9]
出力: [8,9,9,9,0,0,0 ,1]
ヒント:
1. 各リンク リストのノード数は [1, 100] の範囲内です。
2. 0 <= Node.val <= 9
3. タイトル データは、リストで表される数値に先行ゼロが含まれていないことを保証します。
解決策: 本質
的には、2 つのリンク リストに整数が逆順に格納されるということです。2 つのリンク リストの整数を取り出して加算し、その結果を新しいリンク リストに逆順に格納する必要があります。
2 つの問題解決方法:
再帰的および非再帰的 (主に時間計算量の違いに反映されます)
再帰的方法:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
return this.addTwoNumbers2(l1,l2,0);
}
public ListNode addTwoNumbers2(ListNode l1, ListNode l2,int a) {
if(l1==null&&l2==null){return a==0?null:new ListNode(a);}
if(l1 !=null){a += l1.val;l1 = l1.next;}
if(l2 !=null){a += l2.val;l2 = l2.next;}
return new ListNode(a%10,addTwoNumbers2(l1,l2,a/10));
}
}
非再帰的な方法:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode root = new ListNode(0);
ListNode cursor = root;
int carry = 0;
while(l1 != null || l2 != null || carry != 0) {
int l1Val = l1 != null ? l1.val : 0;
int l2Val = l2 != null ? l2.val : 0;
int sumVal = l1Val + l2Val + carry;
carry = sumVal / 10;
ListNode sumNode = new ListNode(sumVal % 10);
cursor.next = sumNode;
cursor = sumNode;
if(l1 != null) l1 = l1.next;
if(l2 != null) l2 = l2.next;
}
return root.next;
}
}