leetcode每天一题:【合并两个有序链表】(简单)

85 阅读2分钟

这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战

题目描述

leetcode题目地址

有两个升序的链表,需要你把它们合并成一个新的链表,并且是按照升序顺序排列。

补充:新链表的节点是通过拼接两个链表的节点组成的。

如下图:(手工画图😂)

image.png

例子:

list1: [1,2,4]
list2: [2,4,5]
返回 [1,2,2,4,4,5]

思路分析

链表

js中没有链表的概念,所以也就没有它的遍历方法了。

链表是由节点组成的。每个节点有2个值,一个是当前节点的值,一个指向下一个节点的指针,最后一个会指向null,代表链表没有下一个节点。

但是它和数组不同的是,数组储存是一段连续的区域。链表不需要,它的节点都是独立的,只是通过next来建立连接,连接上下节点。

数组如果要增加元素或者删除元素,整个数组都要移动。

链表不需要,如果需要增加链表的节点或者删除链表的节点,只需要改变它的next指向和上(下)一个节点的next指向。

上面说了,链表的节点有2个值,一个是当前的val,一个是next,指向下一个节点。

方法

因为js没有链表,所以无法遍历。

但是因为题目的两个链表是有序的,升序的,这里我们可以使用递归方法来重新排序。

我们先判断如果链表是否为null,如果是null,则无需判断(因为它没有val和next字段),直接返回另一个链表即可。

如果链表1的val大于链表2的val,则继续用链表2的next节点和链表1来比较,递归调用,最终结果赋值给链表2的next节点。然后返回链表2。

如果链表2的val大于链表1的val,则继续用链表1的next节点和链表2来比较,递归调用,最终结果赋值给链表1的next节点。然后返回链表1。

最终得到的结果就是链表小的节点排在前面,大的节点排在后面,升序。

代码如下:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} list1
 * @param {ListNode} list2
 * @return {ListNode}
 */
var mergeTwoLists = function (list1, list2) {
  if (list1 === null) return list2
  if (list2 === null) return list1
  if (list1.val > list2.val) {
    list2.next = mergeTwoLists(list1, list2.next)
    return list2
  } else {
    list1.next = mergeTwoLists(list1.next, list2)
    return list1
  }
};

image.png