1. 题目
https://leetcode.cn/problems/add-two-numbers/
2. 解法
解答思路。
为了解决这个问题,我们需要模拟两数相加的过程,从低位到高位,逐位相加,并考虑进位的情况。我们可以使用以下的步骤:
- 创建一个虚拟头节点,它不存储任何值,只是为了方便返回结果链表的头节点。
- 创建一个当前节点指针,指向虚拟头节点。
- 创建一个进位标志,初始为0。
- 遍历两个链表,直到两个链表都遍历完毕。
- 取出两个链表中对应位置的值,如果某个链表为空,则取0。
- 将这两个值加上进位标志,得到当前位的和。
- 用除以10的商来更新进位标志,用余数来创建一个新节点,存储当前位的值。
- 将当前节点指针的下一个节点指向这个新节点,并将当前节点指针移动到下一个节点。
- 如果最后还有进位,创建一个新节点,存储进位值,并将当前节点指针的下一个节点指向这个新节点。
- 返回虚拟头节点的下一个节点,即结果链表的头节点。
这样,我们就完成了两数相加的问题。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) { int carry = 0; StringBuilder sb = new StringBuilder(); ListNode dummy = new ListNode(-1); ListNode curr = dummy; while (l1 != null || l2 != null || carry != 0) { int sum = carry; if (l1 != null) { sum += l1.val; l1 = l1.next; } if (l2 != null) { sum += l2.val; l2 = l2.next; } curr.next = new ListNode(sum % 10); curr = curr.next; carry = sum / 10; } return dummy.next; }