将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 1:
示例 2:
输入:l1 = [], l2 = [] 输出:[]
示例 3:
输入:l1 = [], l2 = [0] 输出:[0]
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和l2
均按 非递减顺序 排列
解题思路
我们可以使用双指针法来解决这个问题。我们定义两个指针 list1
和 list2
分别指向两个链表的头部。然后,我们比较两个指针所指向节点的值,将值较小的节点添加到新链表中,并将对应的指针向后移动一步。重复这个过程直到其中一个链表遍历结束。
算法流程
-
初始化:我们首先创建一个伪头节点 head,并令节点指针 list 指向 head。
-
循环合并:我们使用循环来合并两个链表,直到其中一个链表为空为止。
- 当
list1
或list2
为空时,跳出循环。 - 当
list1.val < list2.val
时,将 list 的后继节点指定为list1
,并将list1
向后移动一步。 - 当
list1.val ≥ list2.val
时,将 list 的后继节点指定为list2
,并将list2
向后移动一步。 - 节点 list 向后移动一步,即
list = list.next
。
- 当
-
合并剩余尾部:循环结束时,可能存在两种情况,即
list1
为空或list2
为空。- 如果
list1
不为空,则将其剩余部分添加到节点 list 之后。 - 否则,如果
list2
不为空,则将其剩余部分添加到节点 list 之后。
- 如果
-
返回值:由于合并链表的头部可能不是真正的头节点,而是伪头节点 head 的后继节点,因此我们返回
head.next
。# 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]: head = ListNode() list = head while list1 and list2: if list1.val < list2.val: list.next = list1 list1 = list1.next else: list.next = list2 list2 = list2.next list = list.next list.next = list1 if list1 else list2 return head.next