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]:
dummyHead = ListNode(0, head)
cur = dummyHead
while cur.next != None and cur.next.next != None:
temp = cur.next
temp1 = cur.next.next.next
cur.next = cur.next.next
cur.next.next = temp
temp.next = temp1
cur = cur.next.next
return dummyHead.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]:
dummyHead = ListNode(next=head)
slowPre = dummyHead
fast = dummyHead
for _ in range(n):
fast = fast.next
while fast.next != None:
fast = fast.next
slowPre = slowPre.next
slowPre.next = slowPre.next.next
return dummyHead.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:
dummyHeadA = headA
curA = dummyHeadA
dummyHeadB = headB
curB = dummyHeadB
nullNode = ListNode(0)
countA = 0
countB = 0
while curA != None:
curA = curA.next
countA += 1
curA = dummyHeadA
while curB != None:
curB = curB.next
countB += 1
curB = dummyHeadB
if countB > countA:
gap = countB - countA
for _ in range(gap):
curB = curB.next
else:
gap = countA - countB
for _ in range(gap):
curA = curA.next
while curA != None:
if curA == curB:
return curA
curA = curA.next
curB = curB.next
return None
2(x+y) = x + (y+z)*n
得
x = z + (n-1)(y+z)
在相交处走z步和从头走x步相遇即为入口点
# 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]:
slow = head
fast = head
count = 0
while fast != None and fast.next != None:
fast = fast.next.next
slow = slow.next
count += 1
if fast == slow:
cur = head
while cur != slow:
cur = cur.next
slow = slow.next
return cur
return None