题目
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
难度
简单
相关知识
递归 链表
题解
- 暴力合并法
# 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 not list1:
return list2
if not list2:
return list1
result = ListNode(0) #创建一个结尾链表
head = result #创建一个
# l1 和 l2 都未遍历结束
while list1 and list2:
if list1.val <= list2.val:
head.next=list1
list1=list1.next
else:
head.next=list2
list2=list2.next
head = head.next# 移动 结果链表 的结尾指针
if list1:
head.next = list1
else:
head.next = list2
return result.next
这里的哑节点在本题中指result,不可移动;move游标指head,每迭代一次即刷新并继续往下走。
以输入[1,2,4]
和[1,3,4]
为例
每次在while
循环中执行head = head.next
的结果为:
ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 4, next: None}}}
ListNode{val: 1, next: ListNode{val: 3, next: ListNode{val: 4, next: None}}}
ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 3, next: ListNode{val: 4, next: None}}
ListNode{val: 4, next: None}
可以清晰看到list1
一步步的变化:
ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 2, next: ListNode{val: 4, next: None}}
ListNode{val: 4, next: None}
ListNode{val: 4, next: None}
None
最后的head为:
ListNode{val: 4, next: ListNode{val: 4, next: None}}
最后的result为:
ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 4, next: None}}}}}}}
所以要return result.next
与本人刷的第二题用了一样的方法。
- 递归
两个链表头部值较小的一个节点与剩下元素的 merge 操作结果合并。
- 终止条件:当 l1 为空或 l2 为空时
- 返回值:每一层调用都返回排序好的链表头
- 本级递归内容:如果 l1 的 val 值更小,则将 l1.next 与排序好的链表头相接,l2 同理
class Solution:
def mergeTwoLists(self, list1: Optional[ListNode], list2: Optional[ListNode]) -> Optional[ListNode]:
if not list1:
return list2
if not list2:
return list1
if list1.val <= list2.val:
list1.next = self.mergeTwoLists(list1.next,list2)
return list1
#第一次判定时可以确定最后结果的第一个节点是来自条链表的,此后的return都做连接线用。
else:
list2.next = self.mergeTwoLists(list1,list2.next)
return list2