2. 2つの数値(Java実装)
タイトル:二つの非空リストを与えは、二つの非負整数を表すために使用されます。その中でも、それぞれの中央値に従った逆方向の保管の、そして、彼らは、各ノードにのみ保存することができます1桁。
我々はこれらの2つの数値を合計した場合、それは新しいリストを返しますし、それらを表現します。
あなたは数字0に加えて、これらの二つの数字が0で始まっていないと仮定することができます。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
コード大物見た後アイデアを更新
アイデア:
- 987 + 23 = 987 + 023 = 1010:リストはフロントフィル0、例えばで短い場合は二つのリストは、トラバースの長さと同じです
- 同時に、キャリー上の問題を検討するためにあらゆるコンピューティングの必要性が、また、キャリー・ビット・コンピューティングの終了後に現在の値を更新する必要があります
- すべてのトラバーサルの二つのリストが完了している場合は、キャリー値は、新しいノード1を追加するリストの最前線に、1です。あなたは結果そうにかかわらず、中央のあなたが運ぶどのくらいのリターンへのビットリストのビットに基づいており、終わるので、ここでは、説明すること、これらのキャリーは、あなたは、私たちは新しい希望、キャリーがある場合は、最後の1まで計算にリストに追加しました(ヴァル= 1)ノードを挿入します。
- 最後の構造は、結果のリストを返しました。白は、Javaで動作してリストされていることを、このステップでは、問題の深い理解でなければなりません:参照Javaはオブジェクト内のオブジェクト。それが明確でない場合は、参照オブジェクトと参照がJavaで話します。簡単に言えば、我々は最初のヘッドにヘッダーオブジェクト、2つの参照ヘッド、一時ポイントを作成します。次に、ヘッドは、新しいオブジェクト(ノード)をリンクするためのツールとして一時人々動かない(= newNodeのtemp.nextを;) 、その後、リンクリストのノードポイントの尾は、*(温度= temp.next;)* 。ヘッドポイントリストの先頭には、結果を返すために使用されてきました。(注:ヘッドノードは、結果の一部ではないので、それはhead.nextを返します)
/**
* 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 head = new ListNode(0);
//两个引用head和temp都指向这个对象,head用来指向链表头,temp是工具人(有点像C语言中移动的指针)
ListNode temp = head;
//进位标志carry
int carry = 0;
//每一位的求和sum
int sum =0;
while(l1!=null||l2!=null){
int x = null==l1?0:l1.val;
int y = null==l2?0:l2.val;
sum = x+y+carry;
//计算本位是否有进位
carry = sum/10;
//插入本位的计算结果
ListNode newNode = new ListNode(sum%10);
//将新结点插入到链表中
temp.next=newNode;
//指针移动,temp一直指向链表的尾部
temp = temp.next;
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
//最高位如果有进位,则插入一个新结点(val=1)
if(carry>0){
temp.next = new ListNode(carry);
}
//head指向的头结点不是结果的一部分,真正的返回结果从head.next开始
return head.next;
}
}
- 結果:
- 私は、私のような多くの人が、私は再びヘッドノードを削除しないで、私のリストは結果である無用ヘッドノードたいべき理由head.nextは、非常に不幸な感じ見て信じています。私は上記の問題を解決するために、上記のコードを少し変更されますので、それは実際には非常に簡単です、ライン上で裁判官を追加します。
/**
* 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 head = null;
ListNode temp = null;
//进位标志carry
int carry = 0;
//每一位的求和sum
int sum =0;
while(l1!=null||l2!=null){
int x = null==l1?0:l1.val;
int y = null==l2?0:l2.val;
sum = x+y+carry;
//计算本位是否有进位
carry = sum/10;
//插入本位的计算结果
ListNode newNode = new ListNode(sum%10);
//将新结点插入到链表中
//如果头结点为null,就将head指向新创建的结点
if(head==null){
head = newNode;
temp = head;
}else{
temp.next=newNode;
temp = temp.next;
}
if(l1 != null)
l1 = l1.next;
if(l2 != null)
l2 = l2.next;
}
//最高位如果有进位,则插入一个新结点(val=1)
if(carry>0){
temp.next = new ListNode(carry);
}
//head指向的头结点不是结果的一部分,真正的返回结果从head.next开始
return head.next;
}
}
- 結果:
次のレコードの私自身の未熟さのアイデア
このトピックを参照してください、私が最初に考えた後、結果がリストに返され、結果を加算して得られた整数、にL1二つのリストを置くこと、であるとL2入力。(だから、愚かな方法は、あなただけの悲しいコーディング、通常はハード動作しない...アルゴリズムレベルを伝えることができます...とても良いコードああをノックします!)
/**
* 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) {
StringBuilder str1 = new StringBuilder();
StringBuilder str2 = new StringBuilder();
//遍历l1链表,存储到str1中
while(l1!=null){
str1.append(l1.val);
l1=l1.next;
}
//遍历l2链表,存储到str2中
while(l2!=null){
str2.append(l2.val);
l2=l2.next;
}
try{
//将l1、l2中字符串逆序后准成int类型
int r1 = Integer.parseInt(str1.reverse().toString());
int r2 = Integer.parseInt(str2.reverse().toString());
//求和得到结果
int r = r1+r2;
// System.out.println(r1+" + "+r2+"="+" "+r);
//将结果r从低位到高位插入到结果链表中
ListNode head = null;
if(r==0){
return new ListNode(0);
}
while(r!=0){
ListNode newNode = new ListNode(r%10);
if(head ==null) {
head = newNode;
}else {
ListNode tmp = head;
while(tmp.next!=null) {
tmp = tmp.next;
}
tmp.next = newNode;
}
r = r/10;
}
return head;
}catch(Exception e){
}
return null;
}
}
- 結果:
演算結果格納されたint型で、その値がint型の試験範囲を表すことができるよりもはるかに大きいですが、問題があります。私はいくつかの記事がを通じてのBigDecimalを使用し、長い作品にはないと述べ読みください。