24. 两两交换链表中的节点
题目链接:24. 两两交换链表中的节点-力扣(LeetCode)
思路:使用虚拟头节点,方便进行节点变换,注意交换节点不能只关注当前两个节点的交换,还需要连接到后一个节点
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
pre_node = ListNode(next=head)
while pre_node.next and pre_node.next.next:
next_node = pre_node.next
pre_node.next = next_node.next
next_node.next = next_node.next.next
pre_node.next.next = next_node
if next_node == head:
head = pre_node.next
pre_node = next_node
return head
参考文章:代码随想录-24. 两两交换链表中的节点
19.删除链表的倒数第N个节点
题目链接:19.删除链表的倒数第N个节点-力扣(LeetCode)
思路:双指针思想,先确定距离,再同时移动两个指针,保证后一个指针到达尾部时,前一个指针正在前n+1个
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
left = ListNode(next = head)
right = left
for i in range(n):
right = right.next
if right is None:
return -1
while right.next:
left = left.next
right = right.next
if left.next == head:
return head.next
left.next = left.next.next
return head
面试题 02.07. 链表相交
题目链接:面试题 02.07. 链表相交-力扣(LeetCode)
思路:其实和上一题双指针的思路是有点类似的,都是先确定差值,再同时移动,要点在于确定两个指针的位置
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
len_A, len_B = 0, 0
temp = headA
while temp:
len_A += 1
temp = temp.next
temp = headB
while temp:
len_B += 1
temp = temp.next
temp_B = headB
temp_A = headA
if len_A <= len_B:
for _ in range(len_B-len_A):
temp_B = temp_B.next
else:
for _ in range(len_A-len_B):
temp_A = temp_A.next
while temp_A != temp_B:
temp_A = temp_A.next
temp_B = temp_B.next
return temp_A
142.环形链表II
思路:想到了集合的做法,O(1)的做法真没想出来,数学太难了,可以参考代码随想录的详解,链接见文末
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
visited = set()
while head:
if head in visited:
return head
visited.add(head)
head = head.next
return None
参考文章:代码随想录-142.环形链表II