【Python】力扣刷题入门Day1:合并两个有序链表实战指南

提示:仅供参考

文章目录

  • 一、合并两个有序链表
  • 二、思路
  • 1.合并两个链表,如果有一个链表是空,直接返回另一个链表即可
  • 2.如果两个链表都不为空
  • 三、代码
  • 四、学习总结

  • 力扣题目链接:
    链接: link

    一、合并两个有序链表

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

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

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

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

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

    二、思路

    1.合并两个链表,如果有一个链表是空,直接返回另一个链表即可

    2.如果两个链表都不为空

    新建一个链表,从list1和list2的头节点开始进行比较,哪个小就将哪个节点插在新建链表的末尾,直至其中一个链表全部插入完成,再将另一个链表剩下的节点全部插入新建链表的末尾,合并即可完成
    1.初始化一个节点 list3 = ListNode()
    2.定义一个头指针head指向这个节点
    3.list1和list2都是指向链表头的指针,当这两个指针都不为空的时候,进入循环:
    如果list1的头节点数值较小:
    list3的next指针指向list1
    list1的next指针指向list1的下一个节点;

    if list1.val <= list2.val :
    	list3.next = list1
    	list1 = list1.next
    

    如果list2的头节点数值较小:
    list3的next指针指向list2
    list2的next指针指向list2的下一个节点。

    else :
    	list3.next = list2
        list2 = list2.next
    

    问题:为什么这里用if list1.val > list2.val不行?
    因为在如果list1.val <= list2.val,list1就会指向list1的下一个节点,这时list1就可能已经指向一个空节点了,与list2进行比较就会报错。

    这样一个节点就插入完毕了,这时list3要向后移动,方便插入下一个节点;而head指针不需要移动,因为需要记录新链表的头节点:list3指向list3的next。
    如果list1全部插入完成,那list1就会指向none,这时需要将list2的全部节点插入list3后面;
    如果list2全部插入完成,那list2就会指向none,这时需要将list1的全部节点插入list3后面。
    以上可以将两个链表升序合并,返回head链表的next是返回新的链表。

    问题:为什么这里是返回head.next而不是head?
    因为在前面定义的时候,list3是一个初始化的节点,值为0,head是指向这个初始化节点的,所以head的值也为0,head.next才是新链表的第一个节点。

    三、代码

    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    class Solution:
        def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
            if list1 == None:
                return list2
            if list2 == None:
                return list1
            list3 = ListNode()
            head = list3
            while list1 != None and list2 !=None:
                if list1.val <= list2.val :
                    list3.next = list1
                    list1 = list1.next
                else :
                    list3.next = list2
                    list2 = list2.next
                list3 = list3.next
            if list1 == None:
                list3.next = list2
            elif list2 == None :
                list3.next = list1
            return head.next
    

    四、学习总结

    init函数是ListNode类的构造函数,也是初始方法
    这个ListNode 类定义了一个单链表节点的基本结构,每个节点包含两个属性:
    val:存储节点的值,默认值是0。
    next:指向下一个节点的指针,默认值是None,表示当前节点没有下一节点。
    通过这个类,可以创建和操作单链表中的节点。例如,可以创建多个节点并将它们链接在一起,形成一个链表。
    创建节点:
    node1 = ListNode(1)
    node2 = ListNode(2)
    将两个节点连接起来:
    node1.next = node2


    作者:zyz_Kilig

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】力扣刷题入门Day1:合并两个有序链表实战指南

    发表回复