两数相加
这个题的意思是给你两个链表,这两个链表表示两个数,这两个数是按链表顺序到过来的,比如说:
1->2->3 表示的是数字 321
4->5->6 表示的是数字654
现在要我们求这两个链表对应数值相加结果所对应的链表,比如过321+654=975,反过来对应的链表就是5->7-9 。
思路
由题意可以知道,第一位表示的就是个位,第二位表示的是十位,最后一位表示的是最高为,现在我们只需要把对应位相加,再添加到新链表对应位置上不久可以了吗?但是这里要考虑到一个一个进位的问题,如果个位相加超过了10那么久需要进位。
代码
function ListNode(val,next){
this.val = val
this.next = next
}
function addTwoNumbers(l1, l2) {
const head = new ListNode()
let curNode = head
let carry = 0
while (l1!==null || l2!==null) {
let x = l1 !== null ? l1.val : 0
let y = l2 !== null ? l2.val : 0
let sum = x + y + carry
curNode.val = sum % 10
carry = Math.floor(sum/10)
if(l1!==null) l1=l1.next
if(l2!==null) l2=l2.next
if(carry > 0 || l1 !=null || l2 != null){
curNode.next = new ListNode()
curNode = curNode.next
}
}
if(carry!==0) {
curNode.val = carry
}
return head
}
思路2
我们可以把链表依次遍历然后存入两个数组中,然后调用数组的reverse方法把数组反转,之后再用数组的join('')方法拼接成字符串,再把这个字符串转换成数字,最后把这两个数字相加,再把数字转换成对应的链表不久可以了吗?
function addTwoNumbers2(l1, l2){
const task1 = []
const task2 = []
while(l1 || l2) {
if(l1){
task1.push(l1.val)
l1 = l1.next
}
if(l2){
task2.push(l2.val)
l2 = l2.next
}
}
let target = BigInt(task1.reverse().join('')) + BigInt(task2.reverse().join(''))
// console.log(Number(task1.reverse().join('')));
console.log(target);
const head = new ListNode()
let cur = head
while (target) {
cur.val = target % 10n
target = target / 10n
cur.next = target ? new ListNode() : null
cur = cur.next
}
return head
}
总结
我们提供了两种思路,第一种思路我们直接对链表操作,通过小学学的加法法则,逢10进1,直到把新链表拼好,第二种方法比较好理解,直接把链表压入数组,再把数组反转拼接成数字字符串,最后转换成BigInt,这里不能使用普通数值,会有精度问题。
评论区