开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
题目2 两数相加
周末参加了力扣周赛,遇到一道链表的题,突然不记得要怎么写了,因为好久没有写链表的题了,所以这周主要是写链表的题,而且会开始接触中等难度的题目
题目: 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:
输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.
🙇♂️ 感想: 链表的题目,要注意的是指针的运用以及链表的变化。最主要的就是要区分链表本身跟指针链表的指针的区别
🙇♂️ 解题思路:本题是将两个链表相加为一个链表。
两个思路:
- 将两个链表中相加的值 组合成新的链表
- 将两个链表中其中一个打造成结果返回
我采用了第二种方案,将l1重新打造成结果返回。因为每次相加,只有一个节点可以改变,十位数的数字要存起来与下一次相加。l1与l2作为指针不停的向前移动,所以为了拿到l1的链表,需将l1先复制给一个变量,最后将这个变量返回即可。
- 循环两个链表,每次都共同进步,如果有进位数也要加上,直到其中有一个链表到尽头则停止循环
- 为了防止l1的指针指向空了但是进位数和l2中还有值,需要每次循环判断一下l1.next是否指向空了,如果是并且l2还有值,则将l1.next → l2.next。 如果 l1.next和 l2.next都空了,但是进位数还有值则将l1.next = new ListNode(), 重新new一个节点用于存放最后一个进位数。
- 还有注意l1和l2长度不等的情况下,并且还有进位数,需要单独处理l1
function addTwoNumbers(l1: ListNode | null, l2: ListNode | null): ListNode | null {
let pointer = l1
let next = 0
while (l1 && l2) {
let cur = l1.val + l2.val
if ((cur + next) > 9) {
cur = (cur + next) % 10
next = Math.floor((l1.val + l2.val + next) / 10)
l1.val = cur
} else {
l1.val = cur + next
next = 0
}
if (!l1.next && l2.next) {
l1.next = l2.next
l1 = l1.next
break
} else if (!l1.next && !l2.next && next) {
l1.next = new ListNode()
l1 = l1.next
l2 = l2.next
break
}
l1 = l1.next
l2 = l2.next
}
while (l1 && next) {
let cur = l1.val + next
if (cur > 9) {
next = Math.floor(cur / 10)
cur = cur % 10
} else {
next = 0
}
l1.val = cur
if (!l1.next && next) {
l1.next = new ListNode()
l1 = l1.next
break
}
l1 = l1.next
}
if (next) {
l1.val = next
l1.next = null
}
return pointer
};
🧑🏿💻 这道是一道中等题,对我来说思路是有的,但是就是在操作链表指针的时候一不小心就指向空了,太多细节需要注意。个人感觉重新创建一个新的链表来返回会更好