# 合并两个有序列表(21)

# 题目

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

# 示例

输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4

# 算法

# 迭代

声明一个新的链表头prevNode,然后迭代两个链表l1l2,将prevNode的下一个位置指向较小的值,然后让较小的值得指针向后移动一个,prevNode也向后移动一个,然后继续判断。直到l1l2指向链表尾部时且另一个链表不为空,则将prevNode.next连接到剩余的链表

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
export const mergeTwoLists = (l1, l2) => {
	let prevHead = new listNode(-1);
	let prevNode = prevHead;
	while (l1 && l2) {
		if (l1.val <= l2.val) {
			prevNode.next = l1;
			l1 = l1.next;
		} else {
			prevNode.next = l2;
			l2 = l2.next;
		}
	}
	if (l1) {
		prevNode.next = l1;
	} else {
		prevNode.next = l2;
	}
	return prevHead;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 递归

在每一次递归中,如果l1l2都存在,取l1.vall2.val中较小的那一个值,将其返回,这个节点我们先称之为node

并且在上面的比较后将较小的节点(比如这场较小的节点是l1)的下一个位置指向l2l1.next中较小的节点(即下一次递归的结果),因为上面一步(下一层递归)中会返回较小的节点,所以此时可以将本轮递归中较小的值的下一个位置指向下一层递归中较小的节点

层层递归,直到l1l2为空,此时返回另一个不为空的节点,递归结束

export const mergeTwoLists = (l1, l2) => {
	if (!l1) {
		return l2;
	} else if (!l2) {
		return l1;
	} else if (l1.val < l2.val) {
		l1.next = mergeTwoLists(l1.next, l2);
		return l1;
	} else {
		l2.next = mergeTwoLists(l2.next, l1);
		return l2;
	}
};
1
2
3
4
5
6
7
8
9
10
11
12
13