21.合并两个有序链表

1、题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

2、分析题目

       (1) 首先将这个与列表区分,这是由类组成的链表,与列表无关;

        (2)由代码提示表明,一个ListNode就是一个链表结点,且若是自己创建的结点就是带有头结点的,题目给的空结点就是空结点;

3、思路1 迭代

        设置哨兵,然后直接一个一个结点比较,比完了,谁不空接上谁。

# 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]:
        list0 = list3 = ListNode() # 哨兵结点,便于返回
        while list1 and list2:
            if list1.val <= list2.val:
                list3.next = list1
                list1 = list1.next
            else:
                list3.next = list2
                list2 = list2.next
            list3 = list3.next

        if list1:   # list2为空,直接接上list1
            list3.next = list1
        else:   # list1 为空
            list3.next = list2
        return list0.next    # 返回哨兵结点的下一结点,才是真正内容的头结点
        

4、思路2 递归

直接用 mergeTwoLists 当作递归函数:

递归边界:如果其中一个链表为空,直接返回另一个链表作为合并后的结果。
如果两个链表都不为空,则比较两个链表当前节点的值,并选择较小的节点作为新链表的当前节点。例如 list1的节点值更小,那么递归调用 mergeTwoLists(list1.next, list2),将递归返回的链表接在 list1的末尾。

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        if list1 is None: return list2  # 注:如果都为空则返回空
        if list2 is None: return list1
        if list1.val < list2.val:
            list1.next = self.mergeTwoLists(list1.next, list2)
            return list1
        list2.next = self.mergeTwoLists(list1, list2.next)
        return list2

参考力扣(LeetCode)作者:灵茶山艾府。写博客方便记录,回忆,整合。

本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢,一起加油吧!

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值