在本题目中,我们面临的是一个经典的编程挑战,源自著名的在线编程面试平台LeetCode。问题标题为"两数相加",难度被标记为中等,主要涉及的是使用Swift编程语言来解决这个问题。该问题的核心是模拟两个链表节点表示的非负整数相加的过程。链表的每个节点存储一个数字位,链表的顺序是从个位到最高位。我们需要编写一个函数,接收两个这样的链表作为输入,并返回它们相加的结果。
让我们理解问题的背景和需求。链表是一种数据结构,其中每个节点包含数据和指向下一个节点的引用。在这个问题中,链表的节点代表数字的位,例如,链表`1->2->3`代表数字123。两个链表分别表示两个要相加的数,我们任务是将这两个链表表示的数相加,返回一个新的链表表示结果。
在Swift中,我们可以创建自定义的链表节点类,如`ListNode`,它有一个整数值和一个指向下一个节点的指针。示例代码如下:
```swift
class ListNode {
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
self.next = nil
}
}
```
接下来,我们需要实现`addTwoNumbers`函数,该函数接收两个`ListNode`类型的参数,并返回一个新的`ListNode`。函数的主要逻辑如下:
1. 初始化两个指针,`ptr1`和`ptr2`,分别指向输入链表的头节点。
2. 初始化一个指针`carry`,用于存储进位,初始值为0。
3. 创建一个新链表`result`,用于存储相加结果。
4. 当`ptr1`或`ptr2`不为空时,执行以下操作:
- 计算当前位的和:`sum = ptr1?.val ?? 0 + ptr2?.val ?? 0 + carry`
- 更新进位:`carry = sum / 10`
- 创建新节点,值为`sum % 10`,并添加到结果链表末尾。
- 如果`ptr1`不为空,更新`ptr1`为`ptr1?.next`
- 如果`ptr2`不为空,更新`ptr2`为`ptr2?.next`
5. 如果最后还有进位,创建一个新节点,值为进位,添加到结果链表末尾。
6. 返回结果链表的头节点。
完整代码如下:
```swift
func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
var ptr1 = l1, ptr2 = l2
var carry = 0
var result = ListNode(0)
var currentNode = result
while ptr1 != nil || ptr2 != nil {
let num1 = ptr1?.val ?? 0
let num2 = ptr2?.val ?? 0
let sum = num1 + num2 + carry
carry = sum / 10
currentNode.next = ListNode(sum % 10)
if ptr1 != nil {
ptr1 = ptr1?.next
}
if ptr2 != nil {
ptr2 = ptr2?.next
}
currentNode = currentNode.next
}
if carry > 0 {
currentNode.next = ListNode(carry)
}
return result.next
}
```
这个`addTwoNumbers`函数通过迭代处理链表,确保正确地处理进位,并创建新的链表来表示结果。这个问题锻炼了我们对链表操作、进位计算以及条件逻辑的理解,对于提升Swift编程能力非常有帮助。
在实际的`main.swift`文件中,我们可以编写一些测试用例,调用`addTwoNumbers`函数,验证其正确性。例如:
```swift
let l1 = ListNode(2)
l1.next = ListNode(4)
l1.next?.next = ListNode(3)
let l2 = ListNode(5)
l2.next = ListNode(6)
l2.next?.next = ListNode(4)
let result = addTwoNumbers(l1, l2)
while result != nil {
print(result!.val, terminator: "->")
result = result?.next
}
```
这将输出相加后的链表`7->0->8`,对应数字708。
在`README.txt`文件中,通常会包含关于如何运行代码、预期输出和其他相关信息的简短说明。在本例中,由于问题相对简单,`README.txt`可能只包含如何构建和运行`main.swift`的指令,以及如何查看`addTwoNumbers`函数的结果。
解决这个问题需要对Swift的数据结构(如链表)和控制流有深入理解,同时也提供了一个练习链表操作和递归思维的好机会。通过这个练习,开发者可以增强在实际编程环境中解决问题的能力。