0
点赞
收藏
分享

微信扫一扫

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


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

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

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

迭代法:

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

= ListNode(-1)
prev = prehead

首先创建一个新的链表,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.next

if l1 is not None:
prev.next =

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

完整版代码:

= 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

递归法:

递归代码简洁,但难于理解,尤其对于我这种菜鸟.

放张图 便于理解:(偷的哈哈)

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


看这张图,也就是说我们先比l1和l2里小的那个,然后让小的节点指向剩下的蓝色的那一大坨.

蓝色那一大坨再调用自己。

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


蓝色那一大坨找到了最小的那个点,然后让最小的这个点指向后面的一大坨,就是棕色的那一大坨.

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


棕色那一大坨找到了一个最小点,然后让最小点指向了剩下的那一大坨,就是绿色的那一大坨。

这时候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全接在后面就行了.

.next = self.mergeTwoLists(l1, l2.next)
return l2

通过上面的图解大家应该比较清楚了。
L2接后面剩下的一大坨,
这里的return

完整版代码:

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


举报

相关推荐

0 条评论