该题解使用了双指针的方法来合并两个有序链表。具体思路如下:
1. 创建一个虚拟头节点 dummy,使用指针 p 指向 dummy。
2. 同时遍历两个链表 list1 和 list2,比较当前节点的值,将较小的节点接到 p 指针后面。
3. 移动对应链表的指针到下一个节点。
4. 移动 p 指针到新接入的节点。
5. 重复步骤 2-4,直到其中一个链表遍历完毕。
6. 将剩余未遍历完的链表接到 p 指针后面。
7. 返回 dummy 的下一个节点,即合并后的链表的头节点。
时间复杂度: O(m+n)
空间复杂度: O(1)
# 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 = ListNode()
p = dummy
# 同时遍历两个链表
while list1 or list2:
# 如果 list1 遍历完毕,将 list2 的当前节点接到新链表后面
if not list1:
p.next = ListNode(list2.val)
list2 = list2.next
# 如果 list2 遍历完毕,将 list1 的当前节点接到新链表后面
elif not list2:
p.next = ListNode(list1.val)
list1 = list1.next
# 比较当前节点的值,选择较小的节点接到新链表后面
else:
if list1.val <= list2.val:
p.next = ListNode(list1.val)
list1 = list1.next
else:
p.next = ListNode(list2.val)
list2 = list2.next
# 移动 p 指针到新接入的节点
p = p.next
# 返回合并后的链表的头节点
return dummy.next