算法2(蓝桥杯19)-合并两个有序链表

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

解题思路:

创建一个虚拟节点,循环比较l1、l2链表各节点的大小,将较小的节点追加到虚拟节点后,返回新链表

1、定义链表节点结构,写入测试数据

2、创建一个虚拟节点(哑结点),让当前节点指向虚拟节点

哑结点(dummy node)是一种在链表操作中常用的技巧,它代表一个临时的、不存储有效数据的节点。哑结点通常用作链表的头部或某个操作的起始点,从而简化边界条件的处理。

3、遍历l1、l2链表,比较l1、l2中各个节点的大小(循环条件是两个链表均不为空),将较小的节点,添加到新链表(虚拟节点之后)

4、遍历完后(即有l1或l2的长度为空),将剩余链表(剩余的有序节点)接入后面即可

5、返回新链表

6、完整代码

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>合并两个有序链表</title>
</head>
<body>
    <p>
        <h4>
            挑战内容
        </h4>    
        将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
    </p>
    <p>
        输入:l1 = 1 -> 2 -> 4 -> null, l2 = 1 -> 3 -> 4 -> null
        输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> null
    </p>
</body>
<script>
    // 定义链表节点结构
    function ListNode(val,next=null){
        this.val=val
        this.next=next
    }
    // 测试数据
    let l1=new ListNode(1,new ListNode(2,new ListNode(4)))
    let l2 = new ListNode(1, new ListNode(3, new ListNode(4)))
    mergeTwoLists(l1,l2)
    function mergeTwoLists(l1, l2) {
        // 查看测试数据是否正确
        // console.log(l1,l2);
        // 创建一个虚拟节点
        let node = new ListNode(0)
        // 当前节点
        let cur = node
        // 遍历l1、l2
        while (l1 !== null && l2 !== null) {
            // l1某个节点上的值<=l2某个节点上的值时
            if(l1.val <= l2.val){
                cur.next= l1
                l1 = l1.next
            }else{
                cur.next=l2
                l2=l2.next
            }
            // 当有节点在下一位时(新增了l1/l2节点),当前节点的指针指向下一个节点
            cur=cur.next
        }
        // 遍历完后(即有l1/l2的长度为空),将剩余链表(剩余的有序节点)接入后面即可
        if (l1 !== null) {
            cur.next=l1
        }
        if (l2 !== null) {
            cur.next = l1
        }
        // console.log(node.next);
        
        // 返回新链表
        return node.next
        }


</script>
</html>

注:在提交时需要将定义的链表结构一同提交,即如下:

javascript 复制代码
  // 定义链表节点结构
  function ListNode(val,next=null){
    this.val=val
    this.next=next
}
function mergeTwoLists (l1, l2) {
       // 创建一个虚拟节点
       let node = new ListNode(0)
       // 当前节点
       let cur = node
       // 遍历l1、l2
       while (l1 !== null && l2 !== null) {
           // l1某个节点上的值<=l2某个节点上的值时
           if(l1.val <= l2.val){
               cur.next= l1
               l1 = l1.next
           }else{
               cur.next=l2
               l2=l2.next
           }
           // 当有节点在下一位时(新增了l1/l2节点),当前节点的指针指向下一个节点
           cur=cur.next
       }
       // 遍历完后(即有l1/l2的长度为空),将剩余链表(剩余的有序节点)接入后面即可
       if (l1 !== null) {
           cur.next=l1
       }
       if (l2 !== null) {
           cur.next = l2
       }
       // console.log(node.next);
       
       // 返回新链表
       return node.next
}

module.exports = mergeTwoLists
相关推荐
ExRoc38 分钟前
蓝桥杯真题 - 填充 - 题解
c++·算法·蓝桥杯
利刃大大1 小时前
【二叉树的深搜】二叉树剪枝
c++·算法·dfs·剪枝
Bunury3 小时前
组件封装-List
javascript·数据结构·list
Joeysoda3 小时前
Java数据结构 (从0构建链表(LinkedList))
java·linux·开发语言·数据结构·windows·链表·1024程序员节
天乐敲代码3 小时前
JAVASE入门九脚-集合框架ArrayList,LinkedList,HashSet,TreeSet,迭代
java·开发语言·算法
比特在路上3 小时前
ListOJ14:环形链表II(寻找环的入口点)
数据结构·链表
十年一梦实验室3 小时前
【Eigen教程】矩阵、数组和向量类(二)
线性代数·算法·矩阵
Kent_J_Truman3 小时前
【子矩阵——优先队列】
算法
快手技术5 小时前
KwaiCoder-23BA4-v1:以 1/30 的成本训练全尺寸 SOTA 代码续写大模型
算法·机器学习·开源
一只码代码的章鱼5 小时前
粒子群算法 笔记 数学建模
笔记·算法·数学建模·逻辑回归