Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

合并两个有序链表 #35

Open
Geek-James opened this issue Sep 16, 2019 · 0 comments
Open

合并两个有序链表 #35

Geek-James opened this issue Sep 16, 2019 · 0 comments
Labels
算法 About algorithm

Comments

@Geek-James
Copy link
Owner

一、啥是链表?

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

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

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

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

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

问题分析

  • 1、考虑两个链表L1,L2中数据的多少
  • 2、空值的情况
  • 3、用两个指针同时遍历两个有序链表L1,L2,并且比较每次读取的两个链表元素的数值,将其中的小值插入到新的链表L中。
  • 4、考虑到其中链表L1(或者L2)由于元素少,而被先遍历完,另个链表L2(或者L1)直接接在新的链表L表尾;
  • 5、函数返回新链表L的表头。

实现要点

1、设置指针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-合并连个有序链表进行验证。

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

参考链接:

链表基础知识总结

js实现链表

数据结构——链表

扫一扫下面的二维码,回复学习即可免费领取最新前端学习资料,也希望在前端进阶的路上,我们一起成长,一起进步!

@Geek-James Geek-James added the 算法 About algorithm label Sep 16, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
算法 About algorithm
Projects
None yet
Development

No branches or pull requests

1 participant