LeetCode算法学习之--数组--合并两个有序链表

736 阅读1分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

大家好今天给大家分享下一道 LeetCode 简单难度 的题目[合并两个有序链表]

这里主要是分享思路和注释,供大家更好的理解题目解法,代码部分是参考LeetCode 转写成javascript 代码,

题目

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

![图片转载leetCode]img

示例1
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

分析

分析

1.2个升序链表合并为一个升序链表

2.合并到链表=》改变节点的指向

解法

1.迭代

2.递归

解法一:迭代

思路
1.定义一个dummy节点,为主轴
2.迭代2个链表,比较大小
3.小的先放入主轴中
4.余下的未迭代完的链表需要继续进行配置
*/
var mergeTwoLists = function (l1, l2) {
  //   设置的一个dummy为主轴
  const dummy = new ListNode(0);

  let cur = dummy;
  //   同时迭代l1 l2
  while (l1 && l2) {
    //  因为是升序所以 如果l1.val<l2.val 就把l1放入主轴中
    if (l1.val <= l2.val) {
      cur.next = l1;
      l1 = l1.next;
      //   反之也是
    } else {
      cur.next = l2;
      l2 = l2.next;
    }
    // 移动cur到下一个位置待命
    cur = cur.next;
  }

  //如果l1还有值说明 l1还没有迭代完成把所有l1放入主线程中
  while (l1) {
    cur.next = l1;
    cur = cur.next;
    l1 = l1.next;
  }
  //如果l2还有值说明 l2还没有迭代完成把所有l2放入主线程中
  while (l2) {
    cur.next = l2;
    cur = cur.next;
    l2 = l2.next;
  }

  //   返回主线程的第一个节点
  return dummy.next;
};

/* 复杂度
时间 O(n1+n2) n1为li的长度 n2为l2的长度
空间 O(1)
*/

解法二:递归

思路
1.终止条件 l1或者l2为null的时候返回
2.递归每一层就做比较和合并
*/

var mergeTwoLists = function (l1, l2) {
  const cur = new ListNode(0);

  function mergeTwoListsRecursive(l1, l2, cur) {
      //如果l1还有值说明 l1还没有迭代完成把所有l1放入主线程中
    if (!l1) {
      while (l2) {
        cur.next = l2;
        l2 = l2.next;
        cur = cur.next;
      }
      return;
    }
    //如果l2还有值说明 l2还没有迭代完成把所有l2放入主线程中
    if (!l2) {
      while (l1) {
        cur.next = l1;
        l1 = l1.next;
        cur = cur.next;
      }
      return;
    }

    // 比较大小 小的先放入主轴
    if (l1.val <= l2.val) {
      cur.next = l1;
      l1 = l1.next;
    } else {
      cur.next = l2;
      l2 = l2.next;
    }
    cur = cur.next;
    mergeTwoListsRecursive(l1, l2, cur);
  }

  mergeTwoListsRecursive(l1, l2, cur);

  return cur.next;
};

/* 复杂度
时间 O(n1+n2) n1为li的长度 n2为l2的长度
空间 O(1)
*/

总结

这道题考察对链表升序组合的理解,小的放前面

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com