输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
准备一个指针node
,假设指向两个链表的中节点的指针分别是:p1
和p2
。
p1
和p2
的value
大小整个过程的时间复杂度是 O(N), 空间复杂度是 O(1)
/*** 节点定义*/class Node {constructor(value = null, next = null) {this.value = value;this.next = next;}}/*** 合并2个有序单链表成为1个新的有序单链表* @param {Node} p1* @param {Node} p2*/function merge(p1, p2) {if (!p1) {return p2;} else if (!p2) {return p1;}let head = new Node(),node = head;while (p1 && p2) {if (p1.value < p2.value) {node.next = p1;p1 = p1.next;} else {node.next = p2;p2 = p2.next;}node = node.next;}if (!p1) {node.next = p2;}if (!p2) {node.next = p1;}return head.next;}/*** 以下是测试代码*/let list1 = new Node(1, new Node(3, new Node(5, new Node(7, null))));let list2 = new Node(2, new Node(4, new Node(6, new Node(8, null))));let head = merge(list1, list2);while (head) {console.log(head.value);head = head.next;}