【题目】 合并两个有序链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题
由于两个链表都是有序,可以使用双指针,交替判断,遍历两个链表,直到其中一个链表遍历完。
过程如上图所示,到第4步之后,两个链表就比较完了。
虚头结点+遍历
/**
* 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) {
if (!l1) {
return l2
}
if (!l2) {
return l1;
}
// 利用虚头结点
let cur = new ListNode(null), res = cur;
while(true) {
if (l1.val > l2.val) {
cur.next = l2;
l2 = l2.next;
} else {
cur.next = l1;
l1 = l1.next;
}
cur = cur.next;
if (!l1) {
cur.next = l2;
break;
} else if (!l2) {
cur.next = l1;
break;
}
}
return res.next;
};
递归
思路和上面是一样的,每次都是判断两个结点值的大小,只是上面需要新增一个头部结点,
采用递归时直接以头部结点数值小的那个结点作为头部结点。
/**
* 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) {
if (!l1) {
return l2
}
if (!l2) {
return l1;
}
if (l1.val > l2.val) {
// 以l2头结点开始
l2.next = mergeTwoLists(l1, l2.next); // 判断l2下个结点与l1当前结点哪个大
return l2;
} else {
// 以l1头结点开始
l1.next = mergeTwoLists(l1.next, l2); // 反过来判断l1下个结点与l2当前结点哪个大
return l1;
}
};