• 技术文章 >web前端 >js教程

    JavaScript对有序链表的合并详解

    黄舟黄舟2017-03-18 14:49:20原创1164
    对于将两个有序链表合并为一个有序链表的问题,严蔚敏版的《数据结构》中用到了一种经典的算法。

    1.使用两个指针,分别指向两条链表中当前待比较的节点,创建一条新链表,用于存放两条链表中的节点。

    2.每次比较完节点元素的大小,将较小的元素节点引入新链表,指针向后移,这个过程持续到指针中有一个为空。

    3.把另一个非空指针指向链表的剩余部分,链接到新链表之后,这个归并过程就完成了。

    这个算法效率很高,是O(m+n)的,但是它要创建一条新链表。

    假如我有个这样的需求:

    1.将第二个链表合并到第一个链表中,要求不能生成新链表。

    2.第二个链表节点的引用关系不能改动,或者说,不能影响第二条链表。

    该怎么做呢?

    对于这个问题,有3点分析:

    1.这是一个将第二条链表元素插入第一条链表的问题。

    2.插入的节点不能是第二条链表的原节点,而是新节点,否则会影响到第二条链表。

    3.外层循环控制遍历第二条链表,内层循环负责插入新节点,所以是O(m*n)的算法。

    具体实现:

    //将l2合并到l1
    var mergeTwoLists = function(l1, l2) {
    	//遍历l2链表,将元素一一插入l1
        while(l2){
    		//先前的l1元素
            var prev = null;
    		//当前的l1元素
            var cur = l1;
    		//遍历l1链表,找到可插入l2元素的位置
            while(cur && l2.val > cur.val){
    			//记录先前的l1元素
                prev = cur;
    			//记录当前的l1元素
                cur = cur.next;
            }
    		//生成新的节点
    		//注意:并没有利用l2已有的节点
            var newNode = new ListNode(l2.val);
    		//插入新节点
    		//新节点的next指向当前的l1元素
            newNode.next = cur;
    		//如果是在l1链表中间插入
    		//或者说新节点有前驱
            if(prev){
    			//先前元素的next指向新节点
                prev.next = newNode;
            }//如果新节点插在链表头部
            else{
                l1 = newNode;
            }
            l2 = l2.next;
        }
    	//返回l1
        return l1;
    };

    以上就是JavaScript对有序链表的合并详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    上一篇:关于JavaScript求解两个有序列表的中值问题的示例代码 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 聊聊用pkg将Node.js项目打包为可执行文件的方法• Node实战:运用Cookie&Session进行登录验证• 手把手带你了解Angular中的依赖注入• jQuery插件分享:Turn.js实现一个移动端电子书翻页效果• Angular学习之聊聊notification(自定义服务)
    1/1

    PHP中文网