1、题目描述:
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例 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 <= 100
l1
和l2
均按 非递减顺序 排列
2、分析题目
(1) 首先将这个与列表区分,这是由类组成的链表,与列表无关;
(2)由代码提示表明,一个ListNode就是一个链表结点,且若是自己创建的结点就是带有头结点的,题目给的空结点就是空结点;
3、思路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]:
list0 = list3 = ListNode() # 哨兵结点,便于返回
while list1 and list2:
if list1.val <= list2.val:
list3.next = list1
list1 = list1.next
else:
list3.next = list2
list2 = list2.next
list3 = list3.next
if list1: # list2为空,直接接上list1
list3.next = list1
else: # list1 为空
list3.next = list2
return list0.next # 返回哨兵结点的下一结点,才是真正内容的头结点
4、思路2 递归
直接用 mergeTwoLists 当作递归函数:
递归边界:如果其中一个链表为空,直接返回另一个链表作为合并后的结果。
如果两个链表都不为空,则比较两个链表当前节点的值,并选择较小的节点作为新链表的当前节点。例如 list1的节点值更小,那么递归调用 mergeTwoLists(list1.next, list2),将递归返回的链表接在 list1的末尾。
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
list2.next = self.mergeTwoLists(list1, list2.next)
return list2
参考力扣(LeetCode)作者:灵茶山艾府。写博客方便记录,回忆,整合。
本人新手,若有错误,欢迎指正;若有疑问,欢迎讨论。若文章对你有用,点个小赞鼓励一下,谢谢,一起加油吧!