24. 两两交换链表中的节点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
# 在前面添加一个虚拟的节点
res = ListNode(next=head)
pre = res
# 需要至少2个节点
while pre.next and pre.next.next:
cur = pre.next
post = pre.next.next
# 第一步
cur.next = post.next
pre.next = post
# 第二步
post.next = cur
# 第三步
# 进入下一个指针
pre = pre.next.next
return res.next
19. 删除链表的倒数第 N 个结点
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
head_dummy = ListNode()
head_dummy.next = head
slow, fast = head_dummy, head_dummy
while n != 0:
fast = fast.next
n -= 1
while fast.next is not None:
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return head_dummy.next
链表相交
思路:
- 末端对齐
- 确定是否有交点
- 没有就next继续查找
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
lenA, lenB = 0, 0
cur = headA
while cur:
cur = cur.next
lenA += 1
cur = headB
while cur:
cur = cur.next
lenB += 1
curA, curB = headA, headB
if lenA > lenB:
curA, curB = curB, curA
lenA, lenB = lenB, lenA
for _ in range(lenB - lenA):
curB = curB.next
while curA:
if curA == curB:
return curA
else:
curA = curA.next
curB = curB.next
return None