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]:
#创建虚拟头结点
res = ListNode(next = head)
pre = res
while pre.next and pre.next.next:
cur = pre.next
post = pre.next.next
#先链接再断开两节点之间的链
pre.next = post
cur.next = post.next
#断开
post.next = cur
pre = cur
return res.next
19.删除链表的倒数第N个节点
题目简述
给你一个链表,删除链表的倒数第n个节点,并且返回链表的头结点。
题解
== 思路==
快慢指针
- fast首先走n+1步
- slow,fast同时移动,fast走到表尾时,slow指向删除节点的前一个节点
- 删除的基本操作即可
== 代码==
# 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]:
res = ListNode(next=head)
slow,fast = res,res
while(n!=0):
fast = fast.next
n -= 1
while(fast.next):
slow = slow.next
fast = fast.next
#此时fast指向表尾null,slow为删除的前一个
slow.next = slow.next.next
return res.next
160.链表相交
题目简述
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null。
思路
链表末尾对齐,向后移动依次比较,若想等,则找到交点。
- 分别求出链表A,链表B的长度
- 初试curA,curB指向头结点。
- 较长的链表cur指针移动到lenA-lenB位置
- curA,curB向后移动挨个比较
题解
# 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) -> Optional[ListNode]:
lenA,lenB = 0,0
cur = headA
while cur:
cur = cur.next
lenA += 1
cur = headB
while cur:
cur = cur.next
lenB += 1
curA,curB = headA,headB
#长链表移动但不确定谁长,有两个循环,实际上有一个不执行
for i in range(lenA-lenB):
curA = curA.next
for i in range(lenB-lenA):
curB = curB.next
while curA and curB and curA!=curB:
curA = curA.next
curB = curB.next
return curA
142.环形链表II
题目简述
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
思路
- 判断是否有环
- fast走两步,slow走一步,若fast==slow,则有环
- 找到环的入口
- slow:(x+y);fast:x+y+n(y+z);fast = 2*slow
- x = (n-1)(y+z) +z
- 从头结点出发一个指针,从相遇结点出发一个指针,同时移动,相遇处即为入口节点。
题解
# 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,fast = head,head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
#相遇
if slow == fast:
p = head
q = slow
while p != q:
p = p.next
q = q.next
return p
return None