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]:
dummy_head=ListNode(next=head) #注意考虑空循环
cur=dummy_head
while cur.next and cur.next.next:
temp1=cur.next
temp2=cur.next.next.next
cur.next=cur.next.next
cur.next.next=temp1 #cur.next已经更新
temp1.next=temp2
cur=cur.next.next
return dummy_head.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]:
dummy_head=ListNode(0,head) #没懂
fast=dummy_head
slow=dummy_head
for i in range(n):
if fast.next:
fast=fast.next
fast=fast.next
while fast:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return dummy_head.next
面试题02.07.链表相交
# 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:
cura=headA
curb=headB
la=0
lb=0
while cura:
cura=cura.next
la+=1
while curb:
curb=curb.next
lb+=1
cura=headA
curb=headB
if la>=lb:
for i in range(la-lb):
cura=cura.next
while cura:
if cura==curb:
return cura
else:
cura=cura.next
curb=curb.next
if la<lb:
for i in range(lb-la):
curb=curb.next
while curb:
if cura==curb:
return cura
else:
cura=cura.next
curb=curb.next
return None
142.环形链表II
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast=head
slow=head
while fast and fast.next:
fast=fast.next.next
slow=slow.next
if fast==slow:
index1=fast
index2=head
while index1!=index2:
index1=index1.next
index2=index2.next
return index1
return None