返回

JS 链表:力扣 141 和 201 题详解

前端

简介

作为一名软件工程师,算法无疑是必不可少的技能,而链表作为一种重要的数据结构,更是程序员不可忽视的知识点。力扣上的 141 和 201 题便是检验我们对链表理解的绝佳题目。本文将深入解析这两道题,带领大家领略链表的魅力。

力扣 141 题:环形链表

题目

给定一个链表,判断链表是否有环。

解题思路:

要判断链表是否有环,我们可以利用快慢指针法。具体步骤如下:

  1. 设置两个指针,一个指向链表的头结点,另一个指向头结点的下一个节点。
  2. 循环这两个指针,让快指针每次移动两个节点,而慢指针每次移动一个节点。
  3. 如果快指针为空,则说明链表没有环。
  4. 如果快指针和慢指针相遇,则说明链表有环。

代码示例:

const hasCycle = (head) => {
  let slow = head;
  let fast = head ? head.next : null;

  while (slow && fast) {
    slow = slow.next;
    fast = fast.next ? fast.next : null;

    if (slow === fast) {
      return true;
    }
  }

  return false;
};

力扣 201 题:合并两个有序链表

题目:

给定两个有序链表,将它们合并为一个有序链表。

解题思路:

合并两个有序链表,我们可以采用归并排序的思想,通过不断比较两个链表的当前节点,将较小的节点添加到结果链表中。

代码示例:

const mergeTwoLists = (l1, l2) => {
  const dummy = new ListNode(0);
  let current = dummy;

  while (l1 && l2) {
    if (l1.val < l2.val) {
      current.next = l1;
      l1 = l1.next;
    } else {
      current.next = l2;
      l2 = l2.next;
    }

    current = current.next;
  }

  current.next = l1 || l2;

  return dummy.next;
};

总结

链表是一种重要的数据结构,理解和掌握链表的操作是成为一名合格的程序员所必需的。通过对力扣 141 和 201 题的深入解析,我们不仅加深了对链表的理解,也锻炼了算法思维能力。希望本文能够为各位开发者提供有益的指导,祝愿大家在算法的道路上不断进步。