Leetcode21. 合并两个有序链表

该文章提供了一个解决方案,用于合并两个已排序的链表以创建一个新的升序链表。通过头插法,比较两个链表的节点值,将较小值的节点插入到结果链表中,直到其中一个链表为空,然后将非空链表剩余的部分连接到结果链表的末尾。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述:

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

  1. 示例 1:
    • 输入:l1 = [1,2,4], l2 = [1,3,4]
    • 输出:[1,1,2,3,4,4]
  2. 示例 2:
    • 输入:l1 = [], l2 = []
    • 输出:[]
  3. 示例 3:
    • 输入:l1 = [], l2 = [0]
    • 输出:[0]
  • 提示:
    • 两个链表的节点数目范围是 [0, 50]
    • − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 100Node.val100
    • l1 和 l2 均按 非递减顺序 排列

二、解决思路和代码

1. 解决思路
  • 分析:借助一个头指针,使用头插法合并两个有序链表
     
2. 代码
    from typing import Optional
    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]:
            resHead = pre = ListNode(val=-1)
            p1, p2 = list1, list2
            while p1 and p2:
                if p1.val<=p2.val:
                    pre.next = p1
                    p1 = p1.next
                    pre = pre.next
                else:
                    pre.next = p2
                    p2 = p2.next
                    pre = pre.next
            if p1: pre.next = p1
            if p2: pre.next = p2
            return resHead.next

    if __name__ == '__main__':
    
        l1 = [1,2,4]
        l2 = [1,3,4]
        head1 = ListNode(val=0)
        head2 = ListNode(val=0)
        
        pre1, pre2 = head1, head2
        for i in range(len(l1)):
            node = ListNode(val=l1[i])
            pre1.next = node
            pre1 = node
        for i in range(len(l2)):
            node = ListNode(val=l2[i])
            pre2.next = node
            pre2 = node
        head3 = Solution().mergeTwoLists(head1.next, head2.next)
        while head3:
            print(head3.val)
            head3 = head3.next
    ```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值