栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

算法练习——合并有序列表 leetcode.21 python

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法练习——合并有序列表 leetcode.21 python

题目描述:

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

方法一:双指针(三指针)

class ListNode:  # 单链表的结点
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None:
            return l2
        if l2 is None:
            return l1
        # 头结点 value = -1
        prehead = ListNode(-1)
        p = prehead
        # l1 和 l2 都还没取完时 1)比较 2)移动指针p 3)移动指针l
        while l1 is not None and l2 is not None:
            if l1.val <= l2.val:
                p.next = l1
                l1 = l1.next
            else:
                p.next = l2
                l2 = l2.next
            p = p.next
        # 有一方取完后 另一方直接跟在链表后面
        p.next = l1 if l1 is not None else l2
        # 返回不带头指针的链表
        return prehead.next

看到leetcode有人问:如何在编译器内写测试类呢?只需要注意两件事:其一,输入一定是链表形式,因此要自建链表;其二,输出可以用遍历的方式验证结果的正确性。

参考博客:(17条消息) LeetCode Hot 热题100 算法题 21.合并两个有序链表 算法&测试 -easy模式_Evelyn_97的博客-CSDN博客https://blog.csdn.net/weixin_48017483/article/details/111462540

class Test:
    def Test(self):
        # [1,2,4]
        l1 = ListNode(1)
        temp1 = l1
        temp1.next = ListNode(2)
        temp1 = temp1.next
        temp1.next = ListNode(4)
        temp1 = temp1.next

        # [1,2,3]
        l2 = ListNode(1)
        temp2 = l2
        temp2.next = ListNode(2)
        temp2 = temp2.next
        temp2.next = ListNode(3)
        temp2 = temp2.next

        s = Solution()
        # phead2 = phead.next 哑节点的next
        phead2 = s.mergeTwoLists(l1,l2)

        while phead2 != None:
            print(phead2.val, end='→')
            phead2 = phead2.next

t = Test()
t.Test()

方法二:递归

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        if l1 is None:
            return l2
        if l2 is None:
            return l1
        # 判断第一个结点应该是谁
        # 找到第一个结点后 把剩余链表看为全新链表 继续找第一个结点即可
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

为什么不用单独写一个列表已经被取完的情况呢?

请设想,假设l1在递归第n次时被取完(l1.val < l2.val), l1.next = None,则 进入下一次递归时,     

  if l1 is None:
            return l2

递归结束,l2加在了已形成的链表之后。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/753659.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号