leetcode 21. 合并两个有序链表

 

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

 

示例 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 均按 非递减顺序 排列

 

 

文章目录

 

思路

参考:

解题方法
为了更方便的进行合并,有必要创建一个伪节点/哨兵节点( dummy = curr = ListNode()),以哨兵节点开始进行双链表的合并。哨兵节点 (dummy)实际上一个常见的链表处理技巧。创建一个哨兵(或称哑节点)节点 dummy,使得链表操作更加简化,因为我们不需要单独处理空链表的情况。此节点不存储任何实际数据,但其 next 指针会指向合并后链表的头节点;
当某一个链表遍历完,则可以终止迭代,并将另一个链表直接加在合并过的链表后面;
清楚在迭代中链表合并过程里的coding细节,比如:节点通过指针实现合并(curr.next = list1),节点通过指针实现移动(list2 = list2.next);
链表的操作均通过节点实现,list1和list2作为节点均可以移动。

 

 

复制代码
# 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]:

        dummy = curr = ListNode() # 构建哨兵节点,方便链表合并

        while list1 and list2: # 当list1或list2有一个遍历完则停止
            
            if list1.val < list2.val: # 合并list1节点
                curr.next, list1 = list1, list1.next # 比下面的写法更简练
            else:   # 合并list2节点
                curr.next = list2 # 合并节点
                list2 = list2.next # 移动节点
            curr = curr.next # 移动curr节点

        curr.next = list1 if list1 else list2
                
        return dummy.next # 返回哨兵节点后的链表,即为合并链表
复制代码

 

 

 

 

posted @   陈晓猛  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示

目录导航