心路历程:
这道题是少有的链表题目中不需要设置虚拟头结点的,一开始设置了虚拟头结点,做完之后发现有些麻烦。
链表的虚拟头节点主要是方便链表的插入操作和第一个结点的删除操作,题目中的已经给的两个链表并不涉及插入操作,所以只需要给新链表设置虚拟头结点即可。此外,本题中两个已知链表每次只需要查询当前的值,不涉及下一个值的操作,所以也没必要使用虚拟头结点。
注意的点:
1、注意这道题其实是三个指针,两个分别在两个给出的链表上,一个在新的链表上,每次操作完,新的链表的指针和其中一个链表的指针都得移动。
2、while循环的判断条件可以是两个已知链表至少有一个非空。
3、思考循环怎么写的时候可以先按照一般的情况建模,最后再去考虑特殊的边界情况,没必要一开始写循环处理逻辑时就把所有边界条件注意到。
4、在创建新的链表时,一定要考虑使用虚拟头结点。
解法:双指针
python
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
# 双指针
dummy_new = ListNode()
head1, head2, new_head = list1, list2, dummy_new # 两个头结点
while head1 or head2: # 每次把小的值给新的链表
if not head1:
new_head.next = head2
break
if not head2:
new_head.next = head1
break
if head1.val < head2.val: # 把head1接入
new_head.next = head1
head1 = head1.next
new_head.next.next = None # 断开
else:
new_head.next = head2
head2 = head2.next
new_head.next.next = None
new_head = new_head.next # 不要忘了移动新的头结点
return dummy_new.next