[面试常问总结] 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 @ 2021-05-19 19:29  唯一客服系统开发笔记  阅读(69)  评论(0编辑  收藏  举报