题目在这: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