一、题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制
0 <= 链表长度 <= 1000
二、题目解析
-
遍历两个有序链表
既然
l1
和l2
均为有序链表,那么我们可以遍历这两个链表,并且创建一个哑节点作为新链表的前一个节点。- 当
l1
和l2
均不为空时- 若
l1.val < l2.val
,以l1.val
创建新链表的下一个节点,同时l1
指向下一个节点 - 反之,以
l2.val
创建新链表的下一个节点,同时l2
指向下一个节点
- 若
- 当
l1
不为空时,以l1.val
创建新链表的下一个节点,同时l1
指向下一个节点 - 当
l2
不为空时,以l2.val
创建新链表的下一个节点,同时l2
指向下一个节点 - 最后返回哑节点的下一个节点即可
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function(l1, l2) { const head = new ListNode(null); let current = head; while(l1 != null || l2 != null) { if(l1 != null && l2 != null) { if(l1.val < l2.val) { current.next = new ListNode(l1.val); l1 = l1.next; } else { current.next = new ListNode(l2.val); l2 = l2.next; } } else if(l1 != null) { current.next = new ListNode(l1.val); l1 = l1.next; } else if(l2 != null) { current.next = new ListNode(l2.val); l2 = l2.next; } current = current.next; } return head.next; };
- 时间复杂度: O(M+N),M,N分别为l1,l2的长度
- 空间复杂度: O(1),节点引用仅需要常数级别的空间大小
- 当
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof