LeetCode合并两个有序链表 | 算法练习系列

257 阅读2分钟

这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战

前言

今天继续来一道链表的题目,来自LeetCode的合并两个有序链表,讲道理感觉链表这种数据结构挺呆的,不像数组一样,想取那个直接用下标就可以取到,如果你在链表中想取某个值,那么你就只能.next.next.next,不过存在即合理,感觉呆说明我比较菜,哈哈哈

题目描述

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

图图.jpg

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

输出:[1,1,2,3,4,4]

示例 2:

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

输出:[]

示例 3:

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

输出:[0]

解题思路

  • 首先我们从题中得到的信息这两个链表是有序链表,也就是排序好的,那么我就可以把他们当做数组来处理
  • 我们首先声明一个空的链表,用来合并后的链表
  • 我们假设有两个指针,分别指向l1和l2,然后比较l1和l2的大小,谁比较小就存入我们上步声明的空链表,知道l1和l2中的某一个为空
  • 然后判断一下l1和l2那个不为空,把不为空的再拼接到我们声明的那个链表的末尾,下面上代码
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
    let pointer = new ListNode() //声明一个链表用来接收合并过来的项
    let dummy = pointer //声明一个dummy指向我们合并之后的链表,这里的作用是为了return出我们合并的链表,因为此时的pointer已经不是指向头部了

    while(l1!==null && l2!==null){
        if(l1.val<l2.val){
            pointer.next = l1
            l1 = l1.next
        }else{
            pointer.next = l2
            l2 = l2.next
        }
        pointer = pointer.next
    }
    if(l1!==null){
        pointer.next = l1 
    }
    if(l2!==null){
        pointer.next = l2
    }
    return dummy.next //这里返回dummy.next而不是dummy,是因为声明的pointer是一个空链表,pointer.next才是合并过来的第一个项,因此要用dummy.next
};

LeetCode运行结果如下:

合并链表.PNG

总结

链表这种数据结构还是挺有意思的,还是那句话,存在即合理,学会了早晚会有用到的时候,加油,gogogo