【LeetCode】21. 合并两个有序链表

202 阅读3分钟

image.png

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 输入的链表是升序排列的
    • 输出的链表是通过拼接给定的两个链表的所有节点组成的升序链表

二、思路分析:

链表系列的题目,又是脑袋会,手不会的题。怎么把两个链表所有节点进行连接起来呢?

这又要捡回我们在学校学习过的数据结构之链表的知识了。

  • 什么是链表?

    链表是数据结构的一种,在内存中通过节点记录内存地址而相互链接形成的一条链的存储方式。

    链表主要分为单链表和双链表。

    单链表主要由Data和next指针组成

    image.png

    双链表主要由prev指针、Data和next指针组成

    image.png

因此,在本题中,已经给出了链表类的定义,如下

class ListNode(object):
    def __init__(self, val=0, next=None):
         self.val = val
         self.next = next

把两个链表合成升序链表,需要在合并的过程中对比每一个链表的节点数据大小。

对合并链表的过程进行拆解成最小步骤组合:

  • 第一步:比较节点val大小。

      当l1.val小于l2.val值时,则l1.next会向后移动继续与l2剩余节点对比
      当l1.val大于l2.val值时,则l2.next会向后移动继续与l1剩余节点对比
    
  • 第二步:链接节点

    最常用的方法就是递归方法进行求解。 image.png

根据上述递归的图例,我们使用python代码进行实现如下:

class Solution(object):
    def mergeTwoLists(self, list1, list2):
        """
        :type list1: Optional[ListNode]
        :type list2: Optional[ListNode]
        :rtype: Optional[ListNode]
        """

        if list1  is  None :
            return list2
        elif list2  is None:
            return list1
        if list1.val < list2.val:
            list1.next = self.mergeTwoLists(list1.next,list2)
            return list1
        else:
            list2.next = self.mergeTwoLists(list1,list2.next)
            return list2

三、测试类编写:

使用递归函数方法实现了合并两个升序链表后,我们需要站在测试角度,对实现的代码进行单元测试。

首先,根据上述的链表介绍,首先会需要一个链表类进行初始化。

  • 链表类:定义链表由两个值组成。val和next指针

    class ListNode:
    
        def __init__(self,val=0,next=None):
    
            self.val = val
            self.next = next
    
  • 将列表中元素进行链接成列表

    def to_linked_list(iterable):
    
        head = None
    
        for val in reversed(iterable):
    
            head = ListNode(val,head)
    
        return head
    
    
  • 因为输出的结果是以列表的形式展示的,所以需要得出的链表转换成列表。

    def to_native_list(head):
        lst = []
        while head:
            lst.append(head.val)
            head = head.next
        return lst
    
  • 在本地环境上,模拟测试一下链表创建、合并、解析成列表,如下

    l1 = to_linked_list([1,2,3,4,5])
    l2 = to_linked_list([1,1,4,5])
    print(to_native_list(mergeTwoLists(l1,l2)))
    

关于单元测试过程中,最重要的还是测试数据,关于测试数据,我们需要通过以下方法进行设计。

  • 等价类划分:有效等价类和无效等价类
  • 边界值:最大边界和最小边界
  • 错误场景:输入非升序数组

四、总结:

最后,我们提交代码查看:

image.png

递归解法,时间复杂度为O(m+n),空间复杂度为O(m+n)

以上是本期内容,欢迎大佬们点赞评论,下期见~~