力扣——算法入门计划第十天

目录

🍕题目

🍔方法一:递归

🍟代码

 🍔方法二:迭代

🍟代码

🍕题目

🍔方法一:迭代解法 

 🍔方法二:递归


🍕题目

21. 合并两个有序链表

我们可以注意到它插入的小到大,有方向的

🍔方法一:递归

递归时候,同时需要考虑边界情况。

如果 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

 

🍕题目

206. 反转链表

🍔方法一:迭代解法 

# 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

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heart_6662

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值