经典链表问题——合并两个有序链表

合并两个有序链表

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

解法一,迭代法: 

这是我看到的一种解题思路,

一、哑节点

创建哑节点是为了标记合并链表的头节点,合并结束后,哑节点的下一个节点就是合并链表的头节点。这样做的目的是,l1和l2都有可能是我们合并链表的头节点,根据逻辑不同,可能有所不同,需要标记出来。

二、move游标变量

move变量主要记录合并链表的节点位置,随着合并链表节点数的增加始终指向最后一个节点的位置。

三、while循环

当l1和l2均不为空的情况下,对l1和l2实现遍历,直到某一个链表遍历结束,此时剩下的链表可能还没有遍历完

四、拼接剩余链表节点

对没有拼接到合并链表的节点实现拼接。

代码实现:

class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        
        # 定义一个哑节点,作为合并链表的头节点
        dummy = ListNode(0)
        # 定义一个游标,标记合并后链表的尾节点
        move = dummy

        # 当list1和list2都不为空的时候一直遍历
        while list1 and list2:
            # 当前list1的节点值小于list2的节点值时
            if list1.val<=list2.val:
                # move指向较小值的节点
                move.next=list1
                list1=list1.next
            else:
                # move指向较小值的节点
                move.next=list2
                list2=list2.next
            move = move.next
        
        # 将没有遍历完的节点拼接到move后面
        move.next=list1 if list1 else list2
        # dummy是哑节点,在执行第一次判断时已经固定指向头节点,即当第一次执行move.next的时候
        return dummy.next

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值