代码随想录算法训练营第四天| 24. 两两交换链表中的节点 , 19.删除链表的倒数第N个节点 , 面试题 02.07. 链表相交, 142.环形链表II

  • [[24. Swap Nodes in Pairs]]
    • 比较简单,用了不同的顺序(temp = cur.next 以及 temp = cur.next.next)
  • [[19. Remove Nth Node From End of List]]
    • 比较简单
  • [[面试题 02.07. 链表相交]]
    • 思路
      • 如果不相交
        • curA遍历完A之后遍历B
        • curB遍历完B之后遍历A
          • A + B =B+ A ,无论curA,curB遍历的长度都是相等的,最后在curA == curB = null时跳出循环
      • 如果相交
        • 类似于快慢指针找确认循环,只要相交,终究会在交点相遇
    • //java
      public class Solution {
          public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
              ListNode curA = headA;
              ListNode curB = headB;
              
              while (curA != curB){
                  curA = curA == null ? headB : curA.next;
                  curB = curB == null ? headA : curB.next;
              }
              return curA;
      
          }
      }
      
      
      //当然也可以 HashSet
      
      public class Solution {
          public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
              ListNode curA = headA;
              ListNode curB = headB;
              Set<ListNode> set = new HashSet<>();
              while(curA != null){
                  set.add(curA);
                  curA =curA.next;
              }
              while(curB != null){
                  if(set.contains(curB)){
                      return curB;
                  }
                  curB = curB.next;
              }
              return null;
          }
      }
  • [[142. Linked List Cycle II]]
    • 思路
      • 由图可知 第一次相遇时
        • 对于slow的位移= F+a
        • 对于fast的位移= F+a+nC (n为常数, C=a+b,就是绕了几圈)
          • slow的位移/fast的位移 = 1/2
            • 2(F+a)= F+a+nC
              • F+a =nC
                • F= nC-(C-b)
                  • F= (n-1)+b
                    • 所以:一个点从第一次相遇的h点()出发,另一个点从head出发,最终能在cycle entrance相遇
        • 这个方法如果先判断再移动指针可能会超时
      • Time Complexity On
      • HashSet 方法贼简单
        • //java
          public class Solution {
              public ListNode detectCycle(ListNode head) {
                  Set set = new HashSet();
                  
                  ListNode cur = head;
                  
                  while(cur != null){
                      if(set.contains(cur)){
                          return cur;
                      }
                      set.add(cur);
                      cur = cur.next;
                  }
                  return null;
              }
          }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值