# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defswapPairs(self, head: Optional[ListNode])-> Optional[ListNode]:
dummy_head = ListNode(next=head)
cur = dummy_head
while cur.next!=Noneand cur.next.next!=None:
temp1 = cur.next
temp3 = cur.next.next.next
cur.next= temp1.next
cur.next.next= temp1
temp1.next= temp3
cur = cur.next.nextreturn dummy_head.next
19.删除链表的倒数第N个节点
思路
快指针先往前移 n+1 位,因为删除操作需要用被删除元素的前一位节点进行删除,所以比n多差一位。
再把快慢指针同时向后移,直到快指针到空,此时慢指针在倒数第 n+1 个节点。
再进行删除操作。
代码
# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclassSolution:defremoveNthFromEnd(self, head: Optional[ListNode], n:int)-> Optional[ListNode]:
dummy_head = ListNode(next=head)
fast = slow = dummy_head
for i inrange(n+1):
fast = fast.nextwhile fast !=None:
fast = fast.next
slow = slow.next
slow.next= slow.next.nextreturn dummy_head.next
面试题02.07.链表相交
思路
求两个链表的长度
将长链表的cur指针移动到后面与短链表相同的地方,也就是两个链表尾部对齐
同时向后遍历,看是否相等
代码
基础版
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defgetIntersectionNode(self, headA: ListNode, headB: ListNode)-> ListNode:
lenA =0
cur = headA
while cur !=None:
lenA +=1
cur = cur.next
lenB =0
cur = headB
while cur !=None:
lenB +=1
cur = cur.next
curA, curB = headA, headB
if lenA > lenB:
curA, curB = curB, curA
lenA, lenB = lenB, lenA
for i inrange(lenB-lenA):
curB = curB.nextwhile curA:if curA == curB:return curA
else:
curA = curA.next
curB = curB.nextreturnNone
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defdetectCycle(self, head: Optional[ListNode])-> Optional[ListNode]:
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.nextif fast == slow:
slow = head
while slow != fast:
slow = slow.next
fast = fast.nextreturn slow
returnNone
集合法
# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = NoneclassSolution:defdetectCycle(self, head: ListNode)-> ListNode:
visited =set()while head:if head in visited:return head
visited.add(head)
head = head.nextreturnNone