Leetcode 21. 合并两个有序链表

心路历程:

这道题是少有的链表题目中不需要设置虚拟头结点的,一开始设置了虚拟头结点,做完之后发现有些麻烦。

链表的虚拟头节点主要是方便链表的插入操作和第一个结点的删除操作,题目中的已经给的两个链表并不涉及插入操作,所以只需要给新链表设置虚拟头结点即可。此外,本题中两个已知链表每次只需要查询当前的值,不涉及下一个值的操作,所以也没必要使用虚拟头结点。

注意的点:

1、注意这道题其实是三个指针,两个分别在两个给出的链表上,一个在新的链表上,每次操作完,新的链表的指针和其中一个链表的指针都得移动。

2、while循环的判断条件可以是两个已知链表至少有一个非空。

3、思考循环怎么写的时候可以先按照一般的情况建模,最后再去考虑特殊的边界情况,没必要一开始写循环处理逻辑时就把所有边界条件注意到。

4、在创建新的链表时,一定要考虑使用虚拟头结点。

解法:双指针

python 复制代码
class Solution:
    def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
        # 双指针
        dummy_new = ListNode()
        head1, head2, new_head = list1, list2, dummy_new  # 两个头结点
        while head1 or head2:  # 每次把小的值给新的链表
            if not head1: 
                new_head.next = head2
                break
            if not head2:
                new_head.next = head1
                break
            if head1.val < head2.val:  # 把head1接入
                new_head.next = head1
                head1 = head1.next
                new_head.next.next = None  # 断开
            else:
                new_head.next = head2
                head2 = head2.next
                new_head.next.next = None
            new_head = new_head.next  # 不要忘了移动新的头结点
        return dummy_new.next
相关推荐
无极低码2 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发2 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre3 小时前
22 括号生成
算法·深度优先
努力也学不会java4 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎4 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan5 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业5 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe6 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼6 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记6 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表