链表相加

  • 题目
  • 一、分析具体情况
  • 二、具体情况操作
  • 1.链表长度相同
  • 2.链表长度不同
  • 3.进位情况
  • 总结



题目



https://leetcode-cn.com/problems/add-two-numbers/.


提示:以下是思路

一、分析具体情况

两个链表元素进行相加,生成一个新的链表,默认每个元素保存一位,大于一位数的值需要进行进位处理。

  • 两个链表长度相同
  • 数组数值相加 es6_数组数值相加 es6

  • 两个链表长度不同
  • 数组数值相加 es6_链表_02


  • 数组数值相加 es6_赋值_03

  • 两个元素相加之和大于9需要进位。
  • 数组数值相加 es6_数组数值相加 es6_04

二、具体情况操作

1.链表长度相同

按照简单的思路移动链表元素,将其值相加,赋值给新建的链表元素。

代码如下(示例):

let val1 = l1.val;
let val2 = l2.val;
total += val1 + val2;
l1 = l1.next;
l2 = l2.next;

2.链表长度不同

  • 相加结束条件
    当两个链表的长度不相同时,若按照上一步的操作会存在一个链表的所有元素已经相加完成了,链表移动到了null的位置,但另外一个链表还没有操作完所有的元素,并没有走到null的位置。所以,对元素操作结束的条件应该为两个链表都为空才停止操作。
  • 为空链表如何于不为空链表的值进行相加操作
    可以判断,若当前链表为空则赋为0,并且在移动链表元素的时候进行判断,若当前为空代表链表元素都遍历完成不再进行移动操作。

代码如下(示例):

while (l1 || l2) {
  let val1 = l1!=null ? l1.val : 0;
  let val2 = l2!=null ? l2.val : 0;
  total += val1 + val2;
  sum.next = new ListNode(total);
  total = total>= 10 ? 1 : 0;
  sum = sum.next;
  if (l1) {
     l1 = l1.next;
  }
  if (l2) {
     l2 = l2.next;
   }
}

3.进位情况

分析进位不难发现,默认每个元素保存一位的值,最大和为18。若和大于9,则将其除以10的余数保存,中间变量加1累加到下次元素求和中。需要注意的是,当两个链表都为空时,若保存进位值的中间变量不为0,则还需要继续操作,将进位的值保存到新的链表中。
最终代码:

var addTwoNumbers = function(l1, l2) {
    let header = new ListNode(0, undefined);
    let sum = header;
    let total = 0;
    while (total || l1 || l2) {
        let val1 = l1!=null ? l1.val : 0;
        let val2 = l2!=null ? l2.val : 0;
        total += val1 + val2;
        sum.next = new ListNode(total%10);
        total = total>= 10 ? 1 : 0;
        sum = sum.next;
        if (l1) {
            l1 = l1.next;
        }
        if (l2) {
            l2 = l2.next;
        }
    }
    return header.next;
	};
  }

总结


今天分析了一个简单的链表相加的问题,刚开始做的时候,觉得很简单,后来提交了几次发现其实还是有很多细节的问题需要去考虑,学会去思考不同情况下的问题。这是很细节的东西,往往不仅仅是把题目刷出来就可以了。我也发现自己的逻辑思维能力不太行,简单的题目也往往很考察你的逻辑能力,希望自己能坚持刷题,把刷过的每一道题都能用自己的想法分析清楚。