基础结构-链表-合并两个有序链表

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

1. 问题的描述

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

示例 1:

网络异常,图片无法展示
|

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

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

示例 2:

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

输出: []

示例 3:

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

输出: [0]

初始代码

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class LinkList:
    def __init__(self):
        self.head=None
    def initList(self, data):
        while len(data)==0:return None
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next
        return r
    def printlist(self,head):
        a=[]
        if head == None: return []
        node = head
        while node != None:
            a.append(node.val)
            node = node.next
        return a
class Solution:
    def mergeTwoLists(self,l1: ListNode, l2: ListNode) -> ListNode:
        #在此填写代码
if __name__ == '__main__':
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([1,2,4]),LinkList().initList([1,3,4]))))
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([]))))
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([0]))))

2. 解题的思路

  • 标签:链表
  • 保存头指针,移动当前指针,比较大小,最后将还没遍历完的直接接上

3. 解题的方法

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
class LinkList:
    def __init__(self):
        self.head=None
    def initList(self, data):
        while len(data)==0:return None
        self.head = ListNode(data[0])
        r=self.head
        p = self.head
        for i in data[1:]:
            node = ListNode(i)
            p.next = node
            p = p.next
        return r
    def printlist(self,head):
        a=[]
        if head == None: return []
        node = head
        while node != None:
            a.append(node.val)
            node = node.next
        return a
class Solution:
    def mergeTwoLists(self,l1: ListNode, l2: ListNode) -> ListNode:
        p=ListNode(0)
        q=p
        while l1 and l2:
            if l1.val>=l2.val:
                p.next=l2
                l2=l2.next
            else:
                p.next=l1
                l1=l1.next
            p=p.next
        p.next = l1 if l1 is not None else l2
        return q.next
if __name__ == '__main__':
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([1,2,4]),LinkList().initList([1,3,4]))))
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([]))))
    print(LinkList().printlist(Solution().mergeTwoLists(LinkList().initList([]),LinkList().initList([0]))))

第1-30,44-47行: 题目中已经给出的信息,运行代码时要根据这些代码进行编辑(具体为创建链表以及列表、链表转换)

第31行: 创建初始链表p,头指针数值为0

第32行: 保存头指针于变量q上,移动的是p指针

第33行: 当l1和l2都不为None时,循环(print(None)的结果为False)

第34行: 判断l1当前节点的数值是否大于l2当前节点的数值

第35行: 若l1当前节点的数值大于l2当前节点的数值,则将p链表指向l2

第36行: l2节点指向其下一个节点

第37-38行: l1当前节点的数值小于l2当前节点的数值,则将p链表指向l1

第39行: l1节点指向其下一个节点

第40行: p节点指向他的下一个节点,用于为下一个节点赋值

第41行: 若l1或l2有一者为None时,代表一个链表已经遍历到结尾了,但是另一个链表还有数值,此时将p节点指向非空的链表

第42行: 返回q.next(q.next指向新链表的头指针)

代码运行结果为:

网络异常,图片无法展示
|

4. 结构讲解

这里用到了基础结构:链表,简单讲解下这个链表:

链表

链表是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接链表的结构:data为自定义的数据,next为下一个节点的地址。

网络异常,图片无法展示
|

基本元素

节点:每个节点有两个部分,左边称为值域,存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。

head:head节点永远指向第一个节点

tail: tail永远指向最后一个节点

None:链表中最后一个节点的指针域为None值

相关文章
|
1月前
|
Python
【Leetcode刷题Python】21. 合并两个有序链表
介绍了几种不同的方法来合并多个已排序的链表,包括暴力求解、使用小顶堆以及分而治之策略。
33 2
|
3月前
|
存储 算法 C语言
【数据结构与算法 刷题系列】合并两个有序链表
【数据结构与算法 刷题系列】合并两个有序链表
|
1月前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
1月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
1月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
2月前
【数据结构OJ题】合并两个有序链表
力扣题目——合并两个有序链表
35 8
【数据结构OJ题】合并两个有序链表
|
1月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
58 0
|
2月前
【数据结构OJ题】链表的回文结构
牛客题目——链表的回文结构
30 0
【数据结构OJ题】链表的回文结构
|
2月前
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
30 2
|
2月前
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
链表6(法二好理解)------ 7-6 sdut-C语言实验-有序链表的归并分数 20
16 0