第10天:递归 / 回溯
21.合并两个有序链表
1、归并排序:额外建表 时O(m+n) 空O(m+n)
2.归并排序:不额外建表 时O(m+n) 空O(1)
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def mergeTwoLists(self, list1, list2):
"""
:type list1: Optional[ListNode]
:type list2: Optional[ListNode]
:rtype: Optional[ListNode]
"""
ans = ListNode()
dummy = ListNode()
dummy.next = ans
first = list1
second = list2
while first and second:
if first.val >= second.val:
tmp = second.val
second = second.next
else:
tmp = first.val
first = first.next
ans.next = ListNode(tmp)
ans = ans.next
if first:
ans.next = first
else:
ans.next = second
return dummy.next.next
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def mergeTwoLists(self, list1, list2):
"""
:type list1: Optional[ListNode]
:type list2: Optional[ListNode]
:rtype: Optional[ListNode]
"""
dummy = ListNode()#哑结点
prev = dummy #这样最后return dummy.next
first = list1
second = list2
while first and second:
if first.val >= second.val:
prev.next = second #不用新建结点,直接指向下一个满足条件的结点
second = second.next
else:
prev.next = first
first = first.next
prev = prev.next
if first:
prev.next = first
else:
prev.next = second
return dummy.next
206.反转链表
1、就地反转
先特殊操作头节点,让其next为None。然后用while循环反转剩下的结点。需要记录三个节点的值。分别是未反转部分的头节点index,反转成功部分的头节点head,未反转部分的头节点的下一个节点暂存在tmp中。
时O(n) 空O(1)
tmp = index.next index.next = head head = index index = tmp
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return head
index = head.next #记录头节点的下一个节点,头节点先让它next指向None
head.next =None
while index:
tmp = index.next #记录当前指向的下一个节点
index.next = head #让当前节点的next为之前反转好的head序列
head = index #让反转好的链表的头节点更新
index = tmp #当前结点指向下一个结点
return head