这是我参与2022首次更文挑战的第25天,活动详情查看:2022首次更文挑战
题目描述
有两个升序的链表,需要你把它们合并成一个新的链表,并且是按照升序顺序排列。
补充:新链表的节点是通过拼接两个链表的节点组成的。
如下图:(手工画图😂)
例子:
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
}
};