LeetCode-练习-两数之和

129 阅读1分钟

两数之和

题目:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例:

test.jpg
// 接口
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
        }
    }
}
test1.jpg
// 代码示例
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 
};