【Python】力扣刷题入门Day1:合并两个有序链表实战指南
提示:仅供参考
文章目录
力扣题目链接:
链接: 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