21. 合并两个有序链表
合并有序链表
一、递归
递归详解
# 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 list1 is None:
return list2
if list2 is None:
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 list2
二、迭代 – 哨兵节点
1、哨兵节点
哨兵节点的作用是方便得到最后的链表,即一个虚拟的头节点。
2、迭代的过程
# 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]:
# 设置哨兵节点,将较小的节点连接到这个哨兵节点,最后返回prehead.next即可。
prehead = ListNode(-1)
# 设置一个进行移动的指针pre,进行取list1和list2中的最小值使用
pre = prehead
# 当list1和list2均不空的时候
while list1 and list2:
if list1.val <= list2.val:
# 执行list1和list2中的最小值
pre.next = list1
list1 = list1.next
else:
pre.next = list2
list2 = list2.next
pre = pre.next
# 当一开始其中一个链表为空的时候,或者一直遍历直到其中一个短的链表为空的时候,直接把非空的另外一个链表添加到pre.next
if list1 is None:
pre.next = list2
else:
pre.next = list1
return prehead.next