返回

前端菜鸟如何攻克链表两数相加?详解JavaScript解题思路

前端

序言

对于初学前端的开发者来说,算法题无疑是一座令人望而生ጪ的高山。然而,通过循序渐进的学习和练习,我们可以逐步攻克这些难题。本文将带领大家深入浅出地学习如何使用JavaScript解决经典的链表两数相加问题,为前端算法之路添砖加瓦。

链表两数相加简介

两数相加问题是链表算法中一个基础且重要的题目。其任务是将两个以链表形式存储的非负整数相加,并返回结果也是一个链表。

JavaScript解题思路

1. 定义链表节点

首先,我们需要定义一个链表节点的构造函数,其中包含指向下一个节点的指针和存储的数据值。

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

2. 创建两个链表

接下来,创建两个链表,分别表示两个要相加的非负整数。例如:

const num1 = new Node(2);
num1.next = new Node(4);
num1.next.next = new Node(3);

const num2 = new Node(5);
num2.next = new Node(6);
num2.next.next = new Node(4);

3. 定义相加函数

编写核心相加函数,该函数将接收两个链表作为参数,逐位相加,并返回结果链表。

const addTwoNumbers = (l1, l2) => {
  let carry = 0;
  let dummyHead = new Node(0);
  let current = dummyHead;

  while (l1 || l2 || carry) {
    const sum = (l1 ? l1.data : 0) + (l2 ? l2.data : 0) + carry;
    carry = Math.floor(sum / 10);
    current.next = new Node(sum % 10);
    current = current.next;
    l1 = l1 ? l1.next : null;
    l2 = l2 ? l2.next : null;
  }

  return dummyHead.next;
};

步骤详解:

  • 逐位相加:遍历两个链表,逐位相加当前节点的数据值和进位值。
  • 进位处理:如果相加结果大于等于10,则将进位值进位到下一位。
  • 创建结果链表:使用一个虚拟头结点dummyHead来跟踪结果链表,并逐步添加新节点。
  • 遍历至链表结束:持续遍历直到两个链表均为空且进位值为0。

4. 输出结果

调用addTwoNumbers函数,将两个链表相加,并打印结果链表中的数据值。

const result = addTwoNumbers(num1, num2);
console.log("相加结果:");
while (result) {
  console.log(result.data);
  result = result.next;
}

示例代码

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

const addTwoNumbers = (l1, l2) => {
  let carry = 0;
  let dummyHead = new Node(0);
  let current = dummyHead;

  while (l1 || l2 || carry) {
    const sum = (l1 ? l1.data : 0) + (l2 ? l2.data : 0) + carry;
    carry = Math.floor(sum / 10);
    current.next = new Node(sum % 10);
    current = current.next;
    l1 = l1 ? l1.next : null;
    l2 = l2 ? l2.next : null;
  }

  return dummyHead.next;
};

const num1 = new Node(2);
num1.next = new Node(4);
num1.next.next = new Node(3);

const num2 = new Node(5);
num2.next = new Node(6);
num2.next.next = new Node(4);

const result = addTwoNumbers(num1, num2);
console.log("相加结果:");
while (result) {
  console.log(result.data);
  result = result.next;
}

结语

通过本文的讲解,我们掌握了使用JavaScript解决链表两数相加问题的详细步骤。从链表节点定义到核心相加函数的设计,再到输出结果,每一个环节都清晰明了。理解了本算法的精妙之处,相信大家在今后的算法学习中会更加游刃有余。