24. 两两交换链表中的节点
题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题:
关键:
- cur的位置在要交换的两个节点的前面
- 具体如何交换的操作!!
- while种植条件:cur的下一个和下下个都不为空,不能写反不然会空指针异常,用and不是or
- 同样用虚拟头节点
点击查看代码
class Solution:
def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummyhead=ListNode(next=head)
cur=dummyhead
while cur.next and cur.next.next:
tmp=cur.next
tmp1=cur.next.next.next
cur.next=cur.next.next
cur.next.next=tmp
tmp.next=tmp1
cur=cur.next.next
return dummyhead.next
19.删除链表的倒数第N个节点
题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
解题:
思路:链表不知道总长度,所以要用快慢双指针的移动来找到删除的节点。
关键:
- fast比slow快n+1步
- 终止条件:fast指向Null
点击查看代码
class Solution:
def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:
dummyhead=ListNode(next=head)
slow=dummyhead
fast=dummyhead
for i in range(n+1):
fast=fast.next
while fast:
slow=slow.next
fast=fast.next
slow.next=slow.next.next
return dummyhead.next
面试题 02.07. 链表相交
题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
解题:
思路:
- 求出两链表的长度;
- 确定哪个链表长,让cur1表示短链表,cur2表示长链表;
- 长cur2移动到和短cur1长度一样的位置处(末尾对齐),即同时移动(len2-len1)步;
- 用while同时向后移动cur1和cur2,如何指向同一个节点就返回节点。注意:判断句if cur1==cur2表示是否指向一个节点,而不是判断val值。
点击查看代码
class Solution:
def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:
lenA,lenB=0,0
curA=headA
while curA:
lenA+=1
curA=curA.next
curB=headB
while curB:
lenB+=1
curB=curB.next
cur1,cur2=headA,headB
if lenA>lenB: #cur1短,cur2长
cur1,cur2=cur2,cur1
len1,len2=lenB,lenA
else:
len1,len2=lenA,lenB
for i in range(len2-len1):
cur2=cur2.next
while cur1:
if cur1==cur2:
return cur1
else:
cur1=cur1.next
cur2=cur2.next
return None
心得:
- 当在删除、交换等操作中,为了统一处理头结点和其他节点的规则时,需要使用虚拟头节点
- 画图理清思路很重要