代码随想录训练营Day4 链表

    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开始的节点需要用数学公式推导。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值