题目重现:day 012
我是第一次做到这种题目,之前从来没有做过链表的习题。在B站学习了相关知识后下手还是不熟练,直接就copy了官方的答案,整理如下:
第一种方法是递归:
class Solution:
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)
# 较小节点的next指针指向其它所有节点合并后的结果
return l1
else:
l2.next = self.mergeTwoLists(l1, l2.next)
return l2
递归总是给人一种很神秘的感觉,基条件是l1或者l2为None,即到达了最后一个位置。此时返回对方剩下的数列,然后再回溯下一个大的值,直到结束。递归的运行过程不能多想,就是按照自己的理解来就行。比如l1的头结点小于l2,此时把next指针指向其它节点合并的结果,这里可以把l1.next理解成l1头结点之后的所有节点,之后和l2进行合并操作。此时l1是递增序列,返回l1就行。反之同理。
第二个方法是我觉得更好理解:
class Solution:
def mergeTwoLists(self, l1, l2):
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
else:
prev.next = l2
return prehead.next
在头上设立一个值为-1的哑节点,在循环结束的时候一个是空的,另外一个非空。此时把非空的接在末尾即可。然后返回prehead.next,即除去该-1节点之后的链表。
打卡 day012
之后需要总结一下,然后加大一点做题频率。