import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param l1 ListNode类 * @param l2 ListNode类 * @return ListNode类 */ public ListNode addEnergyValues (ListNode l1, ListNode l2) { // write code here ListNode dummyHead = new ListNode(0); // 虚拟头节点 ListNode curr = dummyHead; // 当前节点 int carry = 0; // 进位值 while (l1 != null || l2 != null) { int sum = carry; if (l1 != null) { sum += l1.val; l1 = l1.next; } if (l2 != null) { sum += l2.val; l2 = l2.next; } int digit = sum % 10; // 个位数 carry = sum / 10; // 进位值 curr.next = new ListNode(digit); curr = curr.next; } if (carry > 0) { curr.next = new ListNode(carry); } return dummyHead.next; } }
知识点:
- 链表的数据结构
- 链表的基本操作
- 逆序相加
解释提要:上述代码定义了一个 ListNode
类,用于表示链表节点,包含一个整数值和一个指向下一个节点的指针。另外还定义了一个 Solution
类,其中包含一个方法 addTwoNumbers
,用于将两个逆序链表表示的整数相加。
具体步骤如下:
- 创建一个虚拟头节点
dummyHead
,并将当前节点curr
初始化为虚拟头节点。 - 定义一个进位值
carry
,初始值为 0。 - 遍历两个链表
l1
和l2
,直到两个链表都遍历完。 - 在每一次循环中,首先将进位值
carry
加到当前和sum
中。 - 如果链表
l1
不为空,则将l1
的当前节点值加到sum
中,并将l1
指针移向下一个节点。 - 如果链表
l2
不为空,则将l2
的当前节点值加到sum
中,并将l2
指针移向下一个节点。 - 将
sum
对 10 取余得到当前位的数字,并将sum
除以 10 得到新的进位值。 - 创建一个新的节点,并将当前位的数字作为值赋给该节点,将该节点连接到当前节点的后面。
- 更新当前节点指针
curr
。 - 重复步骤 3-9,直到两个链表都遍历完。
- 最后,如果进位值
carry
大于 0,则创建一个新的节点,将carry
作为值赋给该节点,并将该节点连接到当前节点的后面。 - 返回虚拟头节点的后继节点,即和的链表头节点。
通过以上步骤,可以将两个逆序链表表示的整数相加,并以相同的逆序形式返回表示和的链表。该算法的时间复杂度为O(max(N, M)),其中N和M分别是两个链表的长度。