21.合并两个有序链表
linked list, recursion, https://leetcode.cn/problems/merge-two-sorted-lists/
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100l1和l2均按 非递减顺序 排列
用dummy节点,遍历两个链表,每次选择较小的加入链表。
python
# 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 node),简化边界条件处理
prehead = ListNode(-200)
prev = prehead
# 遍历两个链表直到其中一个为空
while list1 and list2:
if list1.val <= list2.val:
prev.next = list1
list1 = list1.next
else:
prev.next = list2
list2 = list2.next
prev = prev.next
# 连接还未遍历完的那个链表
prev.next = list1 if list1 is not None else list2
# 返回合并后的链表,跳过哨兵节点
return prehead.next递归,判断两个链表的节点哪个较小,较小的节点指向剩余链表合并后的结果,当两个链表都为空,终止递归。
python
# 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]:
if not list1: return list2
if not list2: return list1
if list1.val <= list2.val:
list1.next = self.mergeTwoLists(list1.next,list2)
return list1
else:
list2.next = self.mergeTwoLists(list1,list2.next)
return list2Q. leetcode上链表题的代码该怎么在本地运行?
你可以补全
ListNode类,并添加一个辅助函数来构造和打印链表,这样代码可以在本地运行和测试。例如:pythonfrom typing import Optional, 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 node),简化边界条件处理 prehead = ListNode(-200) prev = prehead # 遍历两个链表直到其中一个为空 while list1 and list2: if list1.val <= list2.val: prev.next = list1 list1 = list1.next else: prev.next = list2 list2 = list2.next prev = prev.next # 连接还未遍历完的那个链表 prev.next = list1 if list1 is not None else list2 # 返回合并后的链表,跳过哨兵节点 return prehead.next # 辅助函数:将列表转换为链表 def list_to_linked_list(lst: List[int]) -> Optional[ListNode]: if not lst: return None head = ListNode(lst[0]) current = head for val in lst[1:]: current.next = ListNode(val) current = current.next return head # 辅助函数:打印链表 def print_linked_list(head: Optional[ListNode]) -> None: values = [] while head: values.append(str(head.val)) head = head.next print(" -> ".join(values) if values else "Empty List") # 测试代码 l1 = list_to_linked_list([1, 2, 4]) l2 = list_to_linked_list([1, 3, 4]) solution = Solution() merged_list = solution.mergeTwoLists(l1, l2) print_linked_list(merged_list)运行步骤:
list_to_linked_list([1, 2, 4])和list_to_linked_list([1, 3, 4])创建两个链表。mergeTwoLists(l1, l2)合并两个链表。print_linked_list(merged_list)以可读格式输出结果。示例输出:
1 -> 1 -> 2 -> 3 -> 4 -> 4这样,你可以在本地直接运行并调试代码! 🚀