19. Remove Nth Node From End of List
#之前刷过,因为这道题思路很特别,所以记得很清楚,用快慢双指针,让fast先走n步,然后再快慢指针一起走,这样fast走到空节点,slow正好在要删除的节点n
#也记得因为要将指针指向我们要删除的节点的前一节点,所以其实fast走到5就行,slow停留在n-1
#虽然思路清楚,但代码实现出了问题,不知道该如何返回head。
dummy = ListNode()
dummy.next = head
slow,fast = dummy,dummy
while n != 0:
fast = fast.next
n -= 1
#while fast != None: #要让fast停留在尾结点(也就是none的签名,应该用fast.next=None,之前没想到这步)
while fast.next != None:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next
160 Intersection of Two Linked Lists
这道题很精妙。是能让人觉得有趣的题目之一。双指针有2种解法。一种是我能容易理解的。有一长一短两个链表,那么我们就先让这两个链表的尾部距离相等。比如一个长度为5,一个长度为3,首先让两个指针都移动3的位置,也就是两个链表尾端对齐时,短链表的开端。因为如果他们相交的话,交点只会在尾端对齐的部分。不会在前面。要这么做,首先要分别算出两个链表的长度。计算长度差。然后指针归零(或者用head,也就是原链表上修改),将长链表的指针移动差值的距离。然后就可以比较两个指针了。当pa != pb,我们就把两个指针依次向后移动一位,直到发现相等的节点,就是我们要求的相交的节点。如果没有相交,最后两个指针都到none,那么返回也返回的none
pa = headA
pb = headB
lena,lenb = 0,0
while pa != None:
pa = pa.next
lena += 1
while pb != None:
pb = pb.next
lenb += 1
if lena > lenb:
for i in range(lena-lenb):
headA = headA.next
elif lenb > lena:
for j in range(lenb-lena):
headB = headB.next
while headA != headB:
headA = headA.next
headB = headB.next
return headA
24. Swap Nodes in Pairs
暂时还没搞清楚
#主要是不知奇数和偶数怎么处理
#还有两两交换的代码写的混乱
#终止条件confusing
142. 环形链表 II
这道题是在141的基础上加了一个求loop开始的节点。141的思路很清楚,设置2个指针,fast一次2步,slow一次一步,如果有loop会在loop里面相交
求loop开始的节点需要用数学公式推导。