Geek-James/Blog

合并两个有序链表

Geek-James opened this issue · 0 comments

一、啥是链表?

  • 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实现链表

数据结构——链表

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