このトピックでは、LeetCodeの最初の2つの番号を一緒にT445 II(中程度)で説明し、T2(中)が参照する2つの番号を追加します。https://blog.csdn.net/Pzzzz_wwy/article/details/105519719
連絡先次のトピック:
ノードの定義
:アイデアについては話さないでください:
まず、トラバーサルを通過すると、最初の値が高い値になり、次に低い値が取得され、位置によって追加されることを知っておく必要があります次に、値を新しいリンクリストに書き込み、具体的な手順を説明します。
まず、スタックを使用して、2つのリンクリストから取得した値を順番に保存します。最初に大きい数値を抽出してから、スタックをプッシュするためです。したがって、スタックの最上位は下位番号であるため、スタックからポップアウトすると、下位番号から追加されるのは下位番号であり、2つの番号を追加するルールに準拠しています。図に示すように、このようにして
、下位2桁を取得し、新しいノードを作成して、それをリンクリストに順番に配置できます。
したがって、リンクリストに入れる方法は、最初に取得する値が下位番号であることを知っておく必要があります。リンクリストに直接挿入すると、リンクリストの位置の番号が最大になるため、ヘッド補間方法を選択してリンクリストを比較します。図に示すように、挿入し
ます。上記の方法を使用してリンクリストを操作し、取得した値をリンクリストに直接追加すると同時に、指定したリンクリストを直接返します(リンクリストの先頭が最上位ビット)。
次のコード:
/**
* 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) {
//定义两个栈来进行存储链表
Stack<Integer> st1=new Stack();
Stack<Integer> st2=new Stack();
//将两个链表的值压栈
while(l1!=null){
st1.push(l1.val);
l1=l1.next;
}
while(l2!=null){
st2.push(l2.val);
l2=l2.next;
}
//定义链表
ListNode head=null;
//存储每次相同位相加时候需要的进位
int cur=0;
while(!st1.empty()||!st2.empty()||cur>0){ //只要任意一个栈中还有数,或者加完后cur为1(此时为最高位相加后进位但是栈空的情况!)
int s1=st1.empty()?0:st1.pop();//如果其中一个栈空了但是取值则会是null,报异常,所以置为0
int s2=st2.empty()?0:st2.pop();
int sum=(s1+s2+cur)%10;
cur=(s1+s2+cur)/10;
//利用头插法,新的节点的next指向链表,再将head指向对node的引用
ListNode node=new ListNode(sum);
node.next=head;
head=node;
}
return head;
}
}
注意すべき点がいくつかあり
ます。1。2つのスタックの要素が同じでない場合、一方がまだ存在し、もう一方が空の場合、合計は必然的にnullの値になり、エラーが報告されるため、判断を追加する必要があります。スタックが空の場合、現在の値をnullにすることはできませんが、0にすることができます。
2.最後の最上位ビットへの追加によってキャリー状況が発生する場合は、cur> 0の場合のみをループ条件に追加する必要があります。これは、最後のループcur =(s1 + s2 + cur)/ 10が0より大きい場合、実際には1であるため、キャリーが発生します。
上記が今回の解決策です。スタックを使用してリンクリストに値を保存し、ヘッダー補間方式を使用して同じ位置に追加するときにリンクリストを挿入してください。問題や疑問がある場合は、以下にメッセージを残してください!ありがとうございました!