目录
🍕题目
我们可以注意到它插入的小到大,有方向的
🍔方法一:递归
递归时候,同时需要考虑边界情况。
如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。
否则,我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。
而如果两个链表有一个为空,递归结束。
我看网上这样评价递归,看起来什么都没做,其实都做完了
🍟代码
# 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
elif list2 is None:
return list1
elif list1.val < list2.val:
list1.next = self.mergeTwoLists(list1.next,list2)
return list1
else:
list2.next = self.mergeTwoLists(list1,list2.next)
return list2
🍔方法二:迭代
首先,我们设定一个哑节点 prehead ,这可以在最后让我们比较容易地返回合并后的链表。
我们需要一个 prev 指针,我们需要做的是调整它的 next 指针。
然后,我们重复以下过程,直到 l1 或者 l2 指向了 null :
如果 l1 当前节点的值小于等于 l2 ,我们就把 l1 当前的节点接在 prev 节点的后面同时将 l1 指针往后移一位。
否则,我们对 l2 做同样的操作。不管我们将哪一个元素接在了后面,我们都需要把 prev 向后移一位。
在循环终止的时候, l1 和 l2 至多有一个是非空的。这意味着我们只需要简单地将非空链表接在合并链表的后面,并返回合并链表即可。
🍟代码
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
prehead = ListNode(-1)
prev = prehead
while l1 and l2:
if l1.val <= l2.val:
prev.next = l1
l1 = l1.next
else:
prev.next = l2
l2 = l2.next
prev = prev.next
# 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 if l1 is not None else l2
return prehead.next
🍕题目
🍔方法一:迭代解法
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
prev,curr = None,head
while curr is not None:
next = curr.next
curr.next = prev
prev = curr
curr = next
return prev
next = curr.next ; 如图 先存起来下一个要移动的对象
curr.next = prev 达成反转的目的 ;如图
创建24 指向 null
prev = curr; prev和curr指针向后移动一位
curr = next;
🍔方法二:递归
def reverseList(self, head: ListNode) -> ListNode:
if head is None or head.next is None:
return head
p = self.reverseList(head.next)
head.next.next = head
head.next = None
return p
递归 = 递 + 归
递推
if head is None or head.next is None: return head
归的是反转
head的 next 的next 指向直接就OK了
head.next.next = head