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]:
dummy=ListNode(0)
dummy.next=head
cur=dummy
while cur.next and cur.next.next :
slow=cur.next
fast=cur.next.next.next
cur.next=cur.next.next
cur.next.next=slow
slow.next=fast
cur=cur.next.next
return dummy.next
19.删除链表的倒数第n个节点
关键在于如何找到倒数第n个节点。本题可以利用双指针的方法去解决。
我们先让fast移动n+1个长度。再让fast和slow一起移动,直到fast指针指向None.
删除操作很简单,就是slow.next=slow.next.next
# 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]:
#找到第n-1个节点,让这个节点指向第n+1个节点。然后让第n个节点指向None
dummy=ListNode(0)
dummy.next=head
cur=dummy
fast,slow=dummy,dummy
for _ in range(n+1):
fast=fast.next
while fast :
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return dummy.next
160.相交链表
本题也用了类似上一题的想法,计算出两条列表的长度。然后让长的那一条去移动m-n个长度。然后两条链表一起移动。看能不能找到相同节点
# 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) -> ListNode:
#先求出两条链表长度的差值
len_a=0;len_b=0
dummy_a=ListNode(0)
dummy_b=ListNode(0)
dummy_a.next=headA
dummy_b.next=headB
cur_a,cur_b=dummy_a,dummy_b
while cur_a is not None:
cur_a=cur_a.next
len_a+=1
while cur_b is not None:
cur_b=cur_b.next
len_b+=1
new_a=dummy_a;new_b=dummy_b
if len_a > len_b:
for _ in range(len_a-len_b):
new_a=new_a.next
else:
for _ in range(len_b-len_a):
new_b=new_b.next
while new_a is not None or new_b is not None:
if new_a == new_b:
return new_a
else:
new_a=new_a.next
new_b=new_b.next
return None
142.环形链表Ⅱ
重要的是搞懂数学的推导,头位置、环起始位置、快慢指针相遇位置之间的关系。做出这道题就不难
# 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=head;fast=head
while fast and fast.next:
slow=slow.next
fast=fast.next.next
if slow==fast:
slow=head
while fast != slow:
fast=fast.next
slow=slow.next
return slow
return None