2. 两数相加
代码
ts
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
let list = new ListNode();
let head = list;
let carry = 0;
while (l1 || l2 || carry) {
if (l1) {
carry += l1.val;
l1 = l1.next;
}
if (l2) {
carry += l2.val;
l2 = l2.next;
}
list = list.next = new ListNode(carry % 10);
carry = Math.floor(carry / 10);
}
return head.next;
};思路
使用链表模拟加法,处理进位:
- 创建哑节点
head作为结果链表的起始点 - 初始化
carry = 0用于存储进位 - 遍历两个链表,直到两个链表都为空且没有进位:
- 将当前节点的值和进位相加到
carry - 创建新节点,值为
carry % 10(当前位的值) - 更新进位
carry = Math.floor(carry / 10)
- 将当前节点的值和进位相加到
- 返回
head.next(跳过哑节点)
关键点
使用
carry变量统一处理两个链表节点值和进位循环条件是
l1 || l2 || carry,确保处理完所有节点和最后的进位使用哑节点简化链表操作,避免特殊处理头节点
时间复杂度
,其中 和 分别是两个链表的长度 空间复杂度
,结果链表的长度