目录
关于链表和数组
操作复杂度
可见,如果经常需要添加或删除结点,链表更好,经常按索引访问元素,数组更好
21. 合并两个有序链表
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
# 设置合并后的表头
new_head = ListNode(-1)
head = new_head
# l1 和 l2总有一个会先走到头
while l1 and l2:
if l1.val < l2.val:
head.next = l1
l1 = l1.next
else:
head.next = l2
l2 = l2.next
head = head.next
# 此时只有一条链表走完,剩下的链表直接拼接在最后面即可
if l1:
head.next = l1
else:
head.next = l2
return new_head.next
2. 两数相加
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# 用0补齐短链表
p1 = l1
p2 = l2
prev_p1 = None
prev_p2 = None
while p1 or p2:
if not p1 and p2:
prev_p1.next = ListNode(0)
p1 = prev_p1.next
if not p2 and p1:
prev_p2.next = ListNode(0)
p2 = prev_p2.next
if p1 and p2:
prev_p1 = p1
prev_p2 = p2
p1 = p1.next
p2 = p2.next
# 齐位运算
p1 = l1
p2 = l2
carry = 0
prev_p1 = None
while p1 and p2:
ifcarry = (p1.val + p2.val + carry) >= 10
p1.val = (p1.val + p2.val + carry) % 10
if ifcarry:
carry = 1
else:
carry = 0
prev_p1 = p1
p1 = p1.next
p2 = p2.next
if not p1 and carry == 1:
prev_p1.next = ListNode(1)
return l1
61. 旋转链表
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
if not head or not head.next:
return head
# 确定长度
p1 = head
length = 0
while p1:
length += 1
p1 = p1.next
pre_tail = None
tail = head
for _ in range(k%length):
while tail.next:
pre_tail = tail
tail = tail.next
pre_tail.next = None
# 尾结点添加进头结点
tail.next = head
head = tail
return head