leetcode 21. 合并两个有序链表 (超详细图解递归)(迭代法)

题目在这:https://leetcode-cn.com/problems/merge-two-sorted-lists/

这时一道链表的题,没有学过数据结构的小伙伴可能这题做不了。

先说便于理解的迭代后面说递归。

迭代法:

注意的点和代码解释都写在代码里…

	prehead = ListNode(-1)
    prev = prehead

	首先创建一个新的链表,prehead和prev都指向这个新链表.
	prehead用于后面返回,而prev是我们接下来要操作的

# .val 取当前指针所指向节点的value.
# .next 指针指向下一个节点.
	while l1 and l2:
        if l1.val <= l2.val:
            prev.next = l1
            l1 = l1.next
     当链表l1和l2都不为空的时候,进入循环.
     如果l1的值小于l2的值,就把l1的值接在我们刚才创建的prev的后面
     l2同理.
        

        prev = prev.next
        然后我们让新链表的指针往后挪准备下次循环装新的值

	if l1 is not None:
        prev.next = l1

	如果L1没有比完还有剩余,就把L1剩下的接在我们前面建立的新链表prev的后面。

    return prehead.next
    这时候前面建立的那个perhead指针排上用场了。
    我们直接返回perhead.next就行了

完整版代码:

    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
    if l1 is not None:
        prev.next = l1
    elif l2 is not None:
        prev.next = l2
    return prehead.next

递归法:

递归代码简洁,但难于理解,尤其对于我这种菜鸟.
放张图 便于理解:(偷的哈哈)
在这里插入图片描述
看这张图,也就是说我们先比l1和l2里小的那个,然后让小的节点指向剩下的蓝色的那一大坨.
蓝色那一大坨再调用自己。
在这里插入图片描述
蓝色那一大坨找到了最小的那个点,然后让最小的这个点指向后面的一大坨,就是棕色的那一大坨.
在这里插入图片描述
棕色那一大坨找到了一个最小点,然后让最小点指向了剩下的那一大坨,就是绿色的那一大坨。

这时候L1已经出现null终止递归,开始返回

1. 绿色直接返回了他剩下的没有比较的 3和4 给了上一层棕色
2. 这时候棕色用它最小的值2和绿色给他返回的。组成了2-3-4返回给了蓝色。
3. 蓝色用它自己最小1和棕色返回来的2-3-4组成了1-2-3-4返回给最初
4. 最后就组成了1-1-2-3-4

	if l1 is None:
        return l2
    首先可以知道一点,就是两个链表一定是有一个先比完了.
    假如l1先比完,那么l2还有剩余,我们只需要吧l2全接在后面就行了.

		如果 l2的值小于l1的值
		
		l2.next = self.mergeTwoLists(l1, l2.next)
        return l2
        
        通过上面的图解大家应该比较清楚了。
        L2接后面剩下的一大坨,
        这里的return L2不要搞错写成返回L1。
        注意看上面的图解。
        在一大坨里面。是谁小返回谁。
        

完整版代码:

def mergeTwoLists(self, l1, l2):
    if l1 is None:
        return l2
    elif l2 is None:
        return l1
    elif l1.val < l2.val:
        l1.next = self.mergeTwoLists(l1.next, l2)
        return l1
    else:
        l2.next = self.mergeTwoLists(l1, l2.next)
        return l2
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

深度不学习!!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值