LeetCode 4452つの数字を追加II
Leetcode 445 Add Two Numbers Ii
LeetCode 4452つの数字を追加II
2つの非負の整数を表すために、2つの空でないリンクリストが指定されています。番号の最上位桁はリストの先頭にあります。各ノードには、1つの番号のみが格納されます。これらの2つの数値を追加すると、新しいリンクリストが返されます。
数値0を除いて、これらの数値はどちらもゼロで始まらないと想定できます。
上級:
入力リストを変更できない場合はどうすればよいですか?つまり、リスト内のノードを反転することはできません。
例:
Enter: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 8 -> 0 -> 7
思考分析
計算中に右端の数値の配置が保証されるため、スタックを使用して各値をリンクリストに格納し、順番に計算することを考えるのが自然です。追加時にキャリーが生成される可能性があるため、キャリーがあるかどうかを示すフラグが使用されます。
ヒント:スタックに要素を追加した後もキャリーが残っている場合は、新しいヘッドノードを追加する必要があります。
迅速なソリューション
public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil } } class Solution { func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? { var node1 = l1 var node2 = l2 var stack1 = [Int]() var stack2 = [Int]() while node1 != nil { stack1.append(node1!.val) node1 = node1!.next } while node2 != nil { stack2.append(node2!.val) node2 = node2!.next } var flag = 0 var head: ListNode? = nil while stack1.count > 0 || stack2.count > 0 || flag > 0 { if stack1.count > 0 { flag += stack1.popLast()! } if stack2.count > 0 { flag += stack2.popLast()! } let node: ListNode = ListNode(flag % 10) node.next = head head = node flag = flag / 10 } return head } }