两数之和
题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
// 接口
interface IListNode {
val:number
next: IListNode | null
}
// 示例中的 l1
const l1:IListNode = {
val: 1,
next : {
val: 4,
next:{
val: 6,
next: null
}
}
}
// 示例中的 l2
const l1:IListNode = {
val: 7,
next : {
val: 5,
next:{
val: 4,
next: null
}
}
}
// 代码示例
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
// 初始化返回链表的 头指针 和 尾指针 ,并都指向 null
let head = null, tail = null;
// 初始化进制数为0
let carry = 0
// 遍历参数链表
while(l1 || l2) {
// 获取链表l1的当前节点值,不存在则为0
const n1 = l1? l1.val : 0
// 获取链表l2的当前节点值,不存在则为0
const n2 = l2? l2.val : 0
// 计算当前两个节点值之和 + 进制数
const sum = n1 + n2 + carry
// 若头指针指向null 则为第一个节点,因此头指针和尾指针同时指向同个节点
if(!head){
head = tail = new ListNode(sum % 10)
} else {
// 不是第一个节点, 则为当前尾节点设置下一个节点值
tail.next = new ListNode(sum % 10)
// 并将尾节点指向当前节点
tail = tail.next
}
// 重新赋值当前节点值和的进制值
carry = Math.floor(sum / 10)
// 如果l1链表存在,则将l1的下一个节点值设置为当前节点值
if(l1){
l1 = l1.next
}
// 如果l2链表存在,则将l2的下一个节点值设置为当前节点值
if(l2){
l2 = l2.next
}
}
// 若进制值不为0,则仍向前进1
if(carry > 0 ){
tail.next = new ListNode(carry)
}
return head
};