记录我不解不出来的题
NO.1 奇偶链表
问题描述
链表基础
链表和数组的区别在于:链表没有索引,但是(1)链表可以很快找到下一块,(2)链表在内存中可以不连续保存
简单的链表元素顺序更换
目的是为了更换3,4. p0指向2,p1指向3.p3指向4.交换3,4的时候使用下面步骤:
1.p1.next指向5 ,
2. p2.next指向3
3. p0的next指向4
实战代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
f_p1 = None
pointer1 = head
pointer2 = head
counter = 1
if head == None or head.next == None: # 特殊情况
return head
while pointer1.next != None: # 找到最后就不找了
f_p1 = pointer1
pointer1 = pointer1.next
counter += 1
if counter % 2 == 1 and counter > 1: # 开始移动
f_p1.next = pointer1.next
pointer1.next = pointer2.next
pointer2.next = pointer1
pointer2 = pointer2.next # pointer2往后移动一格
f_p1, pointer1 = pointer1, f_p1 # 顺序变了我们重新纠正过来。
# 下面这段代码可以帮助查看所有的步骤过程。
# str1 = ""
# test = head
# while test != None:
# str1 += "->" + str(test.val)
# test = test.next
# print(str1, "| f_p1:", f_p1.val, "| p1:", pointer1.val, "| p2:", pointer2.val, "| counter:", counter)
return head
NO.2 根据身高重建队列
解题思路
从低到高考虑:
- 将队列[i,j]以i第一关键升序,j为第二关键字降序排列。
- 初始化一个包含n个位置的空队列
- 第i个人的位置,是队列中从左往右数第j+1个空位置
代码如下:
class Solution:
def reconstructQueue(self, people):
people.sort(key=lambda x: (x[0], -x[1]))
print(people