目录
🍕题目
我们可以注意到它插入的小到大,有方向的
🍔方法一:递归
递归时候,同时需要考虑边界情况。
如果 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
1.
next = curr.next ; 如图
先存起来下一个要移动的对象
2.curr.next = prev
达成反转的目的
;如图
3.
创建24 指向 null
4.
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