[面试常问总结] 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下移
十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》
一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的网站在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的全渠道在线客服系统,致力于帮助广大开发者/公司快速部署整合私有化客服功能。
开源地址:唯一客服(开源学习版)
官网地址:唯一客服官网