Python:链表经典问题之合并有序链表 【算法村E1链表笔记(白银)】

前言

链表是数据结构中最为基础和重要的一部分,围绕链表的算法题层出不穷,“合并K个(≥2个)有序的链表”类似问题就是其中一类,有一定的参考价值。


目录

合并2个有序链表

合并K个有序链表(K>2)


合并2个有序链表

要求:将两个已经排序的链表合并成一个更大的链表并返回。

分析:

本题的解题思路有两个重要因素:一个是构造指针进行遍历和判断;另一个是对于特殊情况(如链表均为空)的处理。

下面我们分别来看。

构造指针进行遍历和判断

因为存在两个链表,而为了得到所有数字,这两个链表显然我们都是要进行遍历的。

因此,对每个链表设一个指针进行这件事:

while list1 and list2:
    if list1.val <= list2.val:
        p.next = list1
        list1 = list1.next
    else:
        p.next = list2
        list2 = list2.next
    p = p.next

可以注意到的是,我直接用了list1和list2进行这项遍历任务。

除了l1和l2,还有一个p是什么呢?

我们知道,遍历的结果需要储存,而p就是我们构造出来的、用来存放大链表的这个新链表。

此外,还有一点需要注意:

我们在如此操作之后,l1或l2的其中一个会剩下没有处理完的节点(显然这些节点的值是足够大的,比另一个链表最后一个还大),那么我们可以直接把这些节点跟在p的后面。

if list1:
    p.next = list1
else:
    p.next = list2

对于特殊情况(链表为空)的处理

虽然很简单,但是也需要处理特殊情况:如果l1或者l1和l2都是空的链表,我们该怎么处理呢?

根据上述的代码,显然并不满足“while list1 and list2”,因此我们需要额外在开头进行判断。

当然,我们也可以用虚拟头节点来规避这件事:

dummy = ListNode(-1)
p = dummy

我们设一个虚拟的节点dummy,使得它的next是原本的head即可。

完整代码:

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        
        dummy = ListNode(-1)
        p = dummy

        while list1 and list2:

            if list1.val <= list2.val:
                p.next = list1
                list1 = list1.next
            else:
                p.next = list2
                list2 = list2.next

            p = p.next

        if list1:
            p.next = list1
        else:
            p.next = list2
        
        return dummy.next

合并K个有序链表(K>2)

直接上图:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值