[面试常问总结] 12. 合并有序链表 (利用双指针一块走,小的一方塞入链表,最后把剩余的塞入链表)

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

 

示例 1:

 

 

 


输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
示例 2:

输入:l1 = [], l2 = []
输出:[]
示例 3:

输入:l1 = [], l2 = [0]
输出:[0]
 

提示:

两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列

 

思路:

双指针法 , l1指针小于l2指针 l1塞入新链表,并下移, 否则l2塞入,l2下移  ; 最后剩的肯定都是大的 , 直接塞入新链表

复制代码
type ListNode struct {
  Val int
  Next *ListNode
}
//合并两个有序链表
//双指针法 , l1指针小于l2指针 l1塞入新链表,并下移, 否则l2塞入,l2下移
func MergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode {
    //定义一个新的链表头
    var root =&ListNode{
    }
    //操作一个副本 , 因为都是指针所以也会影响到root
    //这个副本会不停的往下移动, 如果没有这个副本直接操作root , root只会是最后一个结点
    node:=root
    //l1不为 nil 并且 l2不为nil
    for l1!=nil && l2!=nil{
        //判断两个结点值的大小 , 小的一方链表塞入新链表
        if l1.Val<l2.Val{
            node.Next=l1
            l1=l1.Next
        }else{
            node.Next=l2
            l2=l2.Next
        }
        //新链表也得往下移动 , 要不然会被覆盖
        node=node.Next
    }
    //当前面的循环 , 有一方没有到底的时候 , 那一方肯定是大的 , 把链表直接塞入新链表
    if l1!=nil{
        node.Next=l1
    }
    if l2!=nil{
        node.Next=l2
    }
    return root.Next
}
复制代码

 

//合并两个有序链表
//双指针法 , l1指针小于l2指针 l1塞入新链表,并下移, 否则l2塞入,l2下移
posted @   唯一客服系统开发笔记  阅读(69)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2020-05-19 [Go] golang读取打包html文件到二进制
2020-05-19 [javascript] elementui下login登录页界面和js验证逻辑
2020-05-19 [javascript] elementui下el-switch组件的使用
2016-05-19 [javaSE] IO流(FIle对象递归文件列表)
2016-05-19 [javaSE] 异常捕获
2016-05-19 [javaEE] http协议详细
2016-05-19 [javaSE] 单例设计模式
点击右上角即可分享
微信分享提示
1
chat with us