前端菜鸟的每周一道算法题(三) 合并两个有序链表

1、啥是链表?

  • 1.是由一组节点组成的的集合,其中每一个数据项都是一个节点的一部分,每一个节点还包含指向下一个节点的连接。
  • 2.链表是结构体最重要的应用, 它是一种非固定长度的数据结构,是一种动态存储技术, 它可以根据数据的结构特色和数量使用内存,尤为适用于数据个数可变的数据存储。

2、链表的基本元素有哪些?

  • 1.节点:每一个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。
  • 2.head:head节点永远指向第一个节点
  • 3.tail: tail永远指向最后一个节点
  • 4.None:链表中最后一个节点的指针域为None值

头指针与头结点以及首元结点的关系:html

3、如何合并两个有序链表?

问题分析前端

  • 一、考虑两个链表L1,L2中数据的多少
  • 二、空值的状况
  • 三、用两个指针同时遍历两个有序链表L1,L2,而且比较每次读取的两个链表元素的数值,将其中的小值插入到新的链表L中。
  • 四、考虑到其中链表L1(或者L2)因为元素少,而被先遍历完,另个链表L2(或者L1)直接接在新的链表L表尾;
  • 五、函数返回新链表L的表头。

实现要点bash

一、设置指针t1遍历L1,指针t2遍历L2,指针Ptr指向合适的结点(在L1中的结点,或者L2中的结点)来构造新的链表L。数据结构

代码实现方案一:建立一个新的链表用来存储排列数据, 而后用while循环检测l1和l2中的val值,若是l1.var<=l2.var,那么就让新链表的next指针指向l1的val,,而后改变l1的指针指向而且将l1的下一个值指向l1,依次迭代,反之,若是l1.val>l2.var 那么就让新链表的next指针指向l2val,,而后改变l2的指针指向而且将l2的下一个值指向l2,依次迭代,直到左右节点迭代完,判断l1是否为空,返回新链表l3.函数

<script>
    function mergeTwoLists(l1, l2) {
        var l3 = new ListNode(-1);
        var c3 = l3;

        while (l1 !== null && l2 !== null) {
            if (l1.val <= l2.val) {
                c3.next = l1;
                l1 = l1.next;
            } else {
                c3.next = l2;
                l2 = l2.next;
            }
            c3 = c3.next;
        }
        c3.next = (l1 === null) ? l2 : l1;
        return l3.next;
    }

    // 自定义一个链表
    function ListNode(val) {
        this.val = val;
        this.next = null;
    }
</script>
复制代码

实现方法二:递归学习

function mergeTwoLists(l1, l2) {
    if (l1 = null && l2 == null) {
        return null;
    }
    if (l1 == null) {
        return l2;
    }
    if (l2 == null) {
        return l1;
    }
    if (l1.val < l2.val) {
        l1.next = mergeTwoLists(l1.next, l2);
        return l1;
    } else {
        l2.next = mergeTwoLists(l1, l2.next);
        return l2;
    }
}
复制代码

能够复制以上代码到leetcode-合并连个有序链表进行验证。ui

欢迎小伙伴评论区提出更好的解决方案,记得点赞👍鼓励下哦!this

参考连接:spa

链表基础知识总结.net

js实现链表

数据结构——链表

扫一扫下面的二维码,回复学习便可免费领取最新前端学习资料,也但愿在前端进阶的路上,咱们一块儿成长,一块儿进步!

相关文章
相关标签/搜索