删除链表的倒数第N个节点
刷题日期:2024-04-20
[[19.删除链表的倒数第N个节点]]
思路
使用双指针达到一次扫描便找到目标节点
算法思路
快指针向前移动n次, 然后快慢指针一起移动, 当快指针移动到末尾, 慢指针的next便是目标节点
算法细节
1.
Code
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummy = ListNode(-1, head)
slow = dummy
fast = dummy
for _ in range(n):
fast = fast.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next
两两交换链表中的节点
刷题日期:2024-04-20
[[24. 两两交换链表中的节点]]
思路
虚拟头节点
算法思路
一定要想清楚交换流程
第二个要交换的节点指向第一个
头节点先指向第二个要交换的节点
第一个节点指向原第二个节点后面节点
指针向后移动两位
算法细节
1.
Code
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(-1, head)
cur = dummy
while cur.next and cur.next.next:
temp = cur.next.next.next
cur.next.next.next = cur.next
cur.next = cur.next.next
cur.next.next.next = temp
cur = cur.next.next
return dummy.next
链表相交
刷题日期:2024-04-20
[[160.链表相交]]
思路
链表若是相交, 则肯定是后端对齐的, 从后端对其后的第一个节点向后遍历比较便可解
算法思路
求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到,和curB 末尾对齐的位置, 若两个指针相同则返回, 不相同则同时移动
算法细节
1.
Code
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
l_A = 0
l_B = 0
cur_A = headA
cur_B = headB
while cur_A:
l_A += 1
cur_A = cur_A.next
while cur_B:
l_B += 1
cur_B = cur_B.next
cur_A = headA
cur_B = headB
if l_A > l_B:
for _ in range(l_A - l_B):
cur_A = cur_A.next
else:
for _ in range(l_B - l_A):
cur_B = cur_B.next
for _ in range(min(l_A, l_B)):
if cur_A == cur_B:
return cur_A
else:
cur_A = cur_A.next
cur_B = cur_B.next
return None
环形链表II
刷题日期:2024-04-20
[[142.环形链表II]]
思路
先检测环的存在, 再找入口节点
做过一遍了所以会做
算法思路
首先检测环的存在, 使用快慢双指针, 快指针一次移动两步, 慢指针移动一步, 在移动过程中, 如果快指针本身或快指针指向空, 则没有环; 再检测环的入口节点, 在第一次交点处, 定义快节点, ,慢节点则定义为虚拟头节点, 两节点同时移动, 相遇节点一定为入口节点(数学推导)
算法细节
1. 找入口时快节点先移动一次
因为第一个while的条件, 所以使用了虚拟节点, 避免第一个while进不去; 对应的, 找入口节点时fast也要先移动一次
Code
class Solution:
def detectCycle(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummy = ListNode(next = head)
slow = dummy
fast = head
while fast != slow:
if fast and fast.next:
slow = slow.next
fast = fast.next.next
else:
return None
slow = dummy
fast = fast.next
while slow != fast:
slow = slow.next
fast = fast.next
return slow
更简洁的代码在代码随想录