两两交换链表中的节点
定义两个临时结点temp和temp1,temp用来两两交换,temp1用来向后移。
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
virtual_head = ListNode(next = head) #在头结点前面定义一个虚拟结点
cur = virtual_head
while cur.next and cur.next.next: #cur后有两个结点才继续
temp = cur.next
temp1 = cur.next.next.next
cur.next = cur.next.next #两两交换
cur.next.next = temp
temp.next = temp1 #交换完后temp向后移
cur = cur.next.next
return virtual_head.next
删除链表的倒数第N个节点
利用双指针,快慢指针先错开n个距离,最后一起移动到链表末尾,再删除慢结点的后一个结点。
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
virtual_head = ListNode(0, head)
slow = fast = virtual_head #定义快慢指针
for i in range(n + 1): #快指针比慢指针快n个结点
fast = fast.next
while fast: #随着快指针的移动,慢指针也一起移动
slow = slow.next
fast = fast.next
slow.next = slow.next.next #最后删除慢指针的后一个结点
return virtual_head.next
面试题 02.07. 链表相交
注意是结点相同,不是只结点的值相同,且该解法中提前将长链表设定为B,省去了之后移动结点时判断谁长的问题。
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
lenA, lenB = 0,0
cur = headA
while cur: #计算A链表的长度
cur = cur.next
lenA += 1
cur = headB
while cur: #计算B链表的长度
cur = cur.next
lenB += 1
curA, curB = headA, headB
if lenA > lenB: #统一一下,长的一定是B链表
curA, curB = headB, headA
lenA, lenB = lenB, lenA
for i in range(lenB - lenA): #因A, B链表需末尾对齐,所以先移动在链表B上的指针与A头结点对齐
curB = curB.next
while curA: #同时移动,相同则返回
if curA == curB:
return curA
else:
curA = curA.next
curB = curB.next
return None
142.环形链表II
思路:每走一步判断该结点是否在集合内,有则return,没有则添加
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
node = set() #定义一个list也行,但执行用时很长
while head:
if head in node:
return head
node.add(head)
head = head.next
return None
参考文档:代码随想录