JS实现的算法(九)--合并有序链表

340 阅读1分钟

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

示例:

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

题目来自leetcode

解:

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */

function mergeTwoLists(l1, l2) {
  // l1和l2其实是两个链表的链表头,只要有链表头就相当于拿到了这个链表
  // 把这个方法理解为对比每一个节点,每次对比返回val小的节点,这样的话就很好理解
  if(!l1) {
    // 如果l1已经为null了,那么就没必要继续对比下去了,直接返回l2
    // 注意l2.next可能还有很长的一串,但是肯定都比l1大,所以直接跟在后面,下面也一样
    return l2;
  }
  if(!l2) {
    return l1;
  }
  if (l1.val < l2.val) {
    // 如果l1的值小于l2的值,那么用l1的下一个节点和l2对比,如此递归
    l1.next = mergeTwoLists(l1.next, l2);
    // 全都对比完了,最后返回l1(因为l1的头小于l2的头,所以l2已经不存在了,融合在了l1里,下面相同)
    return l1;
  } else {
    l2.next = mergeTwoLists(l1, l2.next);
    return l2;
  }
}