合并两个有序链表 递归与非递归

21. 合并两个有序链表

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

示例 1:

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

示例 2:

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

示例 3:

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

思路:

  这个题有两种思路:   一种就是简单遍历的方法,用双指针分别在两个链表上游走,每次把较小的那个保存到结果链表中;   还有一种就是用递归的方式,我们明确一个函数mergeTwoLists():传入两个链表,返回合并好的链表的头结点。那每次在这个函数的内部,就先找到传入链表中较小的那个头结点,将这个头结点的next与另一个链表再次进入递归merge,并让这个头结点指向这个merge的结果。如此一来,接下去的操作都交给递归即可——只是需要记得定义base case:当其中某一个传入的链表为空时,就直接返回另一个链表。

代码:

法1(递归)

class Solution(object):

    def mergeTwoLists(self, l1, l2):

        if l1==None:#base case的定义

            return l2

        if l2==None:

            return l1

        #谁小,就让让它指向新的结果

        if l1.val<l2.val:

        #新结果则是小的next与另一个链表的merge

            l1.next= self.mergeTwoLists(l1.next,l2)

            return l1

        else:

            l2.next = self.mergeTwoLists(l2.next,l1)

            return l2

法2:

class Solution(object):

    def mergeTwoLists(self, root1, root2):

        p = ListNode()#自己额外创建一个头结点,作为结果链表的头

        q = p #q就是一个不变的超节点,因为后面p要一直变,q起暂存作用

        while root1  and root2: #遍历两个链表,假如两个链表都还没到末尾

            if root1.val<=root2.val: #如果root1小,p就指向这个节点

                p.next=root1

                p=p.next #然后p和root1同时更新为下一个点

                root1= root1.next

            else:

                p.next=root2

                p=p.next

                root2 = root2.next

        p.next=root1 if root1 else root2 #当有一个为空时,那另一个剩下的全部就是剩余结果部分了。

        return q.next

posted @   JunanP  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示