19题
# 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]:
head_dummy = ListNode()
head_dummy.next = head
slow, fast = head_dummy, head_dummy
while(n>=0):
fast = fast.next
n -= 1
while(fast!= None):
slow = slow.next
fast = fast.next
slow.next = slow.next.next
return head_dummy.next # 不能return head, 因为head是刚开始定义的,head_dummy.next才是真正指向head的。
24题,交换链表中的节点,设置dummy head cur 以及temp的意义
# 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_head = ListNode(next = head)
cur = dummy_head
while cur.next and cur.next.next:
#temp = cur.next 试图在下面直接写cur.next, 不用temp
#temp1 = cur.next.next.next
cur.next = cur.next.next
cur.next.next = cur.next
cur.next.next = cur.next.next.next
cur = cur.next.next
return(dummy_head.next)
这样写运行超时。
下面这样才行
# 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_head = ListNode(next = head)
cur = dummy_head
while cur.next and cur.next.next:
temp = cur.next
temp1 = cur.next.next.next
cur.next = cur.next.next
cur.next.next = temp
temp.next = temp1
cur = cur.next.next
return(dummy_head.next)
dummy_head统一操作方式
cur是一个活动指针,只是起始点是dummy_head
不能用dummy_head直接操作,因为要保留dummy_head 的原始位置用来返回整个链表
temp的作用:在链接消失之前先保存起来
为什么不能用.next替代temp:
因为cur是不断变化的,temp存储的是刚开始的那个链接,不用temp相当于刻舟求剑。
160链表相交
if(lenB > lenA):
curA, curB = curB, curA
lenA, lenB = lenB, lenA
统一让A是最长链,不是的话交换一下。
142 主要是分析
若有环,快慢指针一定会在环内相遇
为什么慢指针在第一圈就会被快指针追上, 因为快指针快一倍
x = z, 这个是数学推导出来的