24. 两两交换链表中的节点
题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题:
关键:
- cur的位置在要交换的两个节点的前面
- 具体如何交换的操作!!
- while种植条件:cur的下一个和下下个都不为空,不能写反不然会空指针异常,用and不是or
- 同样用虚拟头节点
点击查看代码
class Solution:def swapPairs(self, head: Optional[ListNode]) -> Optional[ListNode]:dummyhead=ListNode(next=head)cur=dummyheadwhile cur.next and cur.next.next:tmp=cur.nexttmp1=cur.next.next.nextcur.next=cur.next.nextcur.next.next=tmptmp.next=tmp1cur=cur.next.nextreturn 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=dummyheadfast=dummyheadfor i in range(n+1):fast=fast.nextwhile fast:slow=slow.nextfast=fast.nextslow.next=slow.next.nextreturn 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,0curA=headAwhile curA:lenA+=1curA=curA.nextcurB=headBwhile curB:lenB+=1curB=curB.nextcur1,cur2=headA,headBif lenA>lenB: #cur1短,cur2长cur1,cur2=cur2,cur1len1,len2=lenB,lenAelse:len1,len2=lenA,lenBfor i in range(len2-len1):cur2=cur2.nextwhile cur1:if cur1==cur2:return cur1else:cur1=cur1.nextcur2=cur2.nextreturn None
心得:
- 当在删除、交换等操作中,为了统一处理头结点和其他节点的规则时,需要使用虚拟头节点
- 画图理清思路很重要