【每天一道算法题7】【Python】合并两个有序链表

题目描述

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

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

解法一:递归

通过分析我们不难得出合并两个升序链表有如下关系,即当l1、l2其一为空时,则返回另外一个(因为和空链表合并是本身);当两者都不为空时,我们比较头结点的值,取出小的那一个节点,然后让它指向它的下一个节点和另外一个节点的合并链表。

r e t u r n { l 1 l 2   i s   N o n e l 2 l 1   i s   N o n e l 1 − > m e r g e ( l 1. n e x t , l 2 ) l 1. v a l < l 2. v a l l 2 − > m e r g e ( l 1 , l 2. n e x t ) l 1. v a l > l 2. v a l return\left\{ \begin{array}{rcl} l1&&{l2\ is\ None}\\ l2&&{l1\ is\ None}\\ l1->merge(l1.next, l2) &&{l1.val < l2.val}\\ l2->merge(l1, l2.next) &&{l1.val > l2.val}\\ \end{array} \right. returnl1l2l1>merge(l1.next,l2)l2>merge(l1,l2.next)l2 is Nonel1 is Nonel1.val<l2.vall1.val>l2.val
详细代码:

def merge(ListNode1, ListNode2):
    if not ListNode1:
        return ListNode2
    if not ListNode2:
        return ListNode1
    if ListNode1.val < ListNode2.val:
        ListNode1.next = merge(ListNode1.next, ListNode2)
        return ListNode1
    else:
        ListNode2.next = merge(ListNode1, ListNode2.next)
        return ListNode2

该算法时间复杂度是O(N+M),其中N、M分别是两个链表的长度



解法二:同时遍历两个链表

还有另外一种方法是,我们可以同时遍历两个链表,每次遍历找出值较小的那一个,添加到合并后链表中,然后指针往前挪一位。

详细代码:

def merge(ListNode1, ListNode2):
    # 定义一个链表用于记录合并结果
    resultListNode = ListNode(-1)
    # 定义一个“指针”链表,指向resultListNode的最后一个节点,用于遍历
    tmpListNode = resultListNode
    while ListNode1 and ListNode2:
        if ListNode1.val < ListNode2.val:
            tmpListNode.next = ListNode1
            ListNode1 = ListNode1.next
        else:
            tmpListNode.next = ListNode2
            ListNode2 = ListNode2.next
        tmpListNode = tmpListNode.next
    # 这一步目的是处理遍历完之后,有一个链表为空,而另外一个链表不为空的情况,不为空的链表节点值肯定都是最大的(因为链表是升序的,而我们每次遍历都是取小的那个),所以都放在末尾。
    tmpListNode.next = ListNode1 if ListNode1 else ListNode2
    return resultListNode.next
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值