两个链表相加

145 阅读2分钟

力扣题目来源:leetcode.cn/problems/ad…

image.png

image.png

解题思路: 1.遍历两个链表, 2. 对应位置节点的数值相加, 3. 将结果插入到新链表的尾部 4. 如果进位要想办法保存=》 大于10, 进位,将进位加到下一个节点

image.png

theme: channing-cyan

/**
*实现思路:
1.遍历两个链表,
2. 对应位置节点的数值相加,
3. 将结果插入到新链表的尾部
4. 如果进位要想办法保存=》 大于10, 进位,将进位加到下一个节点

边界问题(两个链表的边界问题)
- 链表链表的长度不一致,短链表的高位我们将它视为0
- 链表高位发生进位的情况下,结果链表需要增加一个节点存放进位数
*
*/

function listNode(val){
  this.val = val
  this.next = next;
}

let addTwoNumbers = function(l1, l2){
  // 3个链表,l1,l2, l3
  // l3表示新链表
  let l3 = new listNode()
  let p3 = l3;
  let p1 = l1;
  let p2 = l2;
  let carry = 0; // 存放进位

  // 1. 遍历两个链表
  // - 用什么来遍历链表呢? => 循环,循环可以用for, while, do-while,哪种更合适呢?
  // 因为我们这题是不能确定链表的长度的,所以用while比较合适
  while(p1 != null || p2!= null){ // 链表的结尾不是null的时候,表示没有结束
    // 但是我们不知道哪个链表长,哪个短,我们以长链表为准
    // 2.获取当前链表节点的值
    let v1 = p1.val ? p1.val : 0
    let v2 = p2.val ? p2.val : 0
    let sum = v1 + v2 // 两个数相加可能出现进位,所以不能用sum来表示p3的下一位
    let num = sum % 10;
    carry = Math.floor(sum / 10) // 进位
    p3.next = new ListNode(num)
    
    //继续指向下一位
   if(p1) p1 = p1.next
   if(p2)  p2 = p2.next
    p3 = p3.next; 
  }

  //  如果链表得出最高位的两个数值相加了也有进行,需要新建一个节点
  if(carry){
    p3.next = new ListNode(carry)
  }
   // 因为p3此时已经指向链表的最后一个节点了,所以不能用p3来作为返回值,只能用l3
  return l3.next
}

题目变形

  • 本题考点之一就是大数加法问题(以后看到大数相加问题就要立刻想到两个链表相加,反过来,只要看到两个链表加法问题,也要想到大数相加=> 将这两个问题强关联记在脑子里)
    • 另外这里我们用到了链表的知识,那我们就要知道,链表是什么,它的概念是什么,要想到链表的存储特性是什么,优点和缺点是什么等这些细节
  • 练习:两数相减如何实现(进位变成借位)

image.png image.png 延伸扩展

  • 凡是涉及到数字类处理题目时候,要考虑能否用数学思维或数学特性来解决问题