题目
题目链接:leetcode-cn.com/leetbook/re…
题解
顺序遍历,逐个比较
遍历两条有序链表,比较两条链表的第一个节点的值谁小; 创建一个空的节点(还是有头节点的链表好操作,不用专门考虑第一个节点的处理),将较小值的节点挂载到以创建的空节点为头节点的链表上; 当两条链表中某条链表为空时,将另一条链表直接挂载到以创建的空节点为头节点的链表上;
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
let head = new ListNode(null,null);
let temp = head;
while(l1 !== null && l2 !== null) {
if(l1.val <= l2.val) {
temp.next = l1;
temp = l1;
l1 = l1.next;
}else {
temp.next = l2;
temp = l2;
l2 = l2.next;
}
}
if(l1 !== null) {
temp.next = l1;
}
if(l2 !== null) {
temp.next = l2;
}
return head.next;
};
2、递归实现
递归有时候总会把你绕晕,这个时候结合实例推演一遍能更好的理清算法;
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
if(l1 === null){
return l2;
}else if(l2 === null) {
return l1;
}
let newHead = null;
if(l1.val <= l2.val) {
newHead = mergeTwoLists(l1.next,l2);
// 当递归回溯到这里时,l1.val 和 l2.val 中较大值的节点已经在更深层的递归中被连接到了新链表中,
// 接下来将 较小值的节点充当新链表的第一个节点,然后返回新链表就行了
l1.next = newHead;
newHead = l1;
}else {
newHead = mergeTwoLists(l1,l2.next);
// 同上
l2.next = newHead;
newHead = l2;
}
return newHead;
};
大家如果有更好的思路和解法,欢迎大家一起来讨论啊~
这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里: