21.合并2个有序列表
题目:将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
有循环过程时可用递归
递归要注意3点:
- 终止条件
- 递归调用过程
- 要考虑1、2的顺序
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
if not l1: return l2 #终止条件
if not l2: return l1
if l1.val<=l2.val: #递归调用
l1.next=self.mergeTwoLists(l1.next,l2)
return l1
else:
l2.next=self.mergeTwoLists(l1,l2.next)
return l2
(1)终止条件:第三行可以看作是 l1非空时为not null,if not not null就是if 0,不执行。若l1为null则if not null为if 1则执行。(第四行同理)
(2)递归调用:ListNode.next=。。。是赋值给下一个指针指向的位置(这个位置是一个整体,可以有多个节点或是一个函数)
24.两两交换链表中的节点
题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
依然是3个条件:
- 终止条件
- 递归调用过程
- 要考虑1、2的顺序
class Solution:
def swapPairs(self, head: ListNode) -> ListNode:
if not head or not head.next: return head #终止条件 head 和head.next不能颠倒
newhead=head.next #递归调用
head.next=self.swapPairs(newhead.next)
newhead.next=head
return newhead
【注】必须要命名newhead,因为当head.next不指向第二个节点,第二个节点就无法调用