質問:2つの非負の整数を表すために、2つの空でないリンクリストを指定します。その中で、それぞれの桁は逆の順序で格納され、各ノードは1桁しか格納できません。これらの2つの数値を合計すると、それらの合計を表す新しいリンクリストが返されます。番号0を除いて、これらの番号はいずれも0で始まらないと想定できます。
例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
問題解決のアイデア:
質問では、それぞれの桁がリンクリストに逆の順序で格納されていると書かれていますが、実際には、加算が実行されたばかりの場合、加算は1桁から始まり、リンクリストは下位桁から始まるため、これにより問題が軽減されます。ちょうど合う前から後ろへ追加の操作の順序(例として質問で与えられたデータを取ります)
合計なので、知ることは難しくありません。2つのリンクリストの各ノードを取り出して、合計(合計)を実行します。10より大きい場合は、キャリー1を記録してから、合計を10の余りを計算し、結果を取得します。これは、ターゲットリンクリストの最初の有効なノードです。特定のプロセスを図に示します。
実装プロセス:
1.コアとなる方法は、2つのリンクリストをトラバースしてから、ノードを1つずつ合計することです。
- これら2つの要件のリンクリストにあるノードの数がわからない(つまり、ループの数がわからない)ため、whileループを選択します。リンクリストのノードがnullでない限り、サイクルを継続する必要があります
- ただし、キャリーケースがあるため、キャリーが0でない場合、ループを停止することはできません(たとえば、9999 + 1)
2.合計の結果を保存するための新しいリンクリストを生成します
- リンクリストの問題では、通常、マークノードが作成され、特定の値は格納されません。次のノードは、主に次の利便性のために、最初の有効なノードを指す役割を果たします(常に最初のノードを指します。移動しません)。ターゲットのリンクリストに戻ります。
- 同時に、モバイルである各ノードの生成を担当する現在のノードを作成する必要があり、各ノードが生成され、新しいリンクリストの構築を実現するためにノードを後方に移動する必要があります
言語能力が少し劣っていて、説明があまり明確でないかもしれません。コードに必要なコメントがあります。理解に役立つことを願っています。
コード
class ListNode
{
public $val = 0;
public $next = null;
public function __construct($val)
{
$this->val = $val;
}
}
class LeetCode002
{
/**
* @param ListNode $l1
* @param ListNode $l2
* @return ListNode
*/
public function addTwoNumbers($l1, $l2)
{
if ($l1 == null && $l2 == null) {
return null;
}
$tag = new ListNode(0);//创建空节点
$current = $tag;
$addOne = 0;//进位
while ($l1 != null || $l2 != null || $addOne != 0) {
$val1 = $l1 == null ? 0 : $l1->val;
$val2 = $l2 == null ? 0 : $l2->val;
$sum = $val1 + $val2 + $addOne;
$current->next = new ListNode($sum % 10);
$current = $current->next;
$addOne = intval($sum / 10);//坑,强类型语言不存在此问题
if ($l1 != null) {
$l1 = $l1->next;
}
if ($l2 != null) {
$l2 = $l2->next;
}
}
return $tag->next;
}
}
//Test Case
$leetCode = new LeetCode002();
$l1 = new ListNode(2);
$l1->next = new ListNode(4);
$l2 = new ListNode(5);
$l2->next = new ListNode(6);
$newList = $leetCode->addTwoNumbers($l1, $l2);
$str = '';
while ($newList != null) {
$str .= $newList->val.'->';
$newList = $newList->next;
}
echo $str;
の結果
[外部リンク画像の転送に失敗しました。ソースサイトにヒル防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-HYvXTrXs-1596157723434)(https://imgkr2.cn-bj.ufileos。 com / 0e5487e6-8aa9-445d -867d-6d270a62a350.png?UCloudPublicKey = TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature = kk9GWabE%252FB3tWbmidbBUJqeBTu4%253D&Expires = 1596484