LC-21. 合并两个有序链表

92 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

输入: l1 = [1,2,4], l2 = [1,3,4]
输出: [1,1,2,3,4,4]

示例 2:

输入: l1 = [], l2 = []
输出: []

示例 3:

输入: l1 = [], l2 = [0]
输出: [0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1 和 l2 均按 非递减顺序 排列

题解

1.递归

我们可以通过递归的方式来进行,自己调用自己的函数来处理。

但是要注意如果其中一个链表的节点的值为空时,则返回另个一链表

const mergeTwoLists = (list1, list2) => {
  if (!list1) return list2
  if (!list2) return list1

  if (list1.val < list2.val) {
    list1.next = mergeTwoLists(list1.next, list2)
    return list1
  } else {
    list2.next = mergeTwoLists(list1, list2.next)
    return list2
  }
}

2.迭代

通过 for 或者 while 来接近得到目标值的一种方式,叫做迭代。

创建一个头结点 prev

通过判断 两个链表节点值是否存在,若存在的话,进行比较,然后赋值给 prev.next。 否则将另一个链表的节点直接赋值给 prev.next

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
const mergeTwoLists = (list1, list2) => {
  // 创建一个 ListNode 头结点
  const prehead = new ListNode(-1)

  let prev = prehead

  while (list1 && list2) {
    if (list1.val <= list2.val) {
      prev.next = list1
      list1 = list1.next
    } else {
      prev.next = list2
      list2 = list2.next
    }
    prev = prev.next
  }

  // 如果其中一个为null,则连接另外一个
  prev.next = list1 === null ? list2 : list1

  return prehead.next
}

总结

题目 15 :可以熟悉 递归 和 迭代 这两个方法分别的概念以及使用。