算法

链表相交问题

2020-10-18  本文已影响0人  小鱼嘻嘻

问题1

求链表是否有环

原理

代码

public class Solution {
    public boolean hasCycle(ListNode head) {
       if(head==null){
           return false;
       }
       ListNode fast = head;
       ListNode slow = head;

       while(fast!=null&&fast.next!=null){
           fast = fast.next.next;
           slow = slow.next;
           if(slow==fast){
               return true;
           }
       }
       return false;
    }
}

注意事项

暂无

问题2

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

原理

代码

public class Solution {
    public ListNode detectCycle(ListNode head) {
      if(head==null||head.next==null){
          return null;
      }
      ListNode fast = head;
      ListNode slow = head;
      while(fast!=null&&fast.next!=null){
          slow = slow.next;
          fast = fast.next.next;
          if(slow==fast){
              break;
          }
      }
      ListNode newHead = head;
      while(newHead!=null&&slow!=null){
         if(slow==newHead){
              break;
          }
          newHead = newHead.next;
          slow = slow.next;
         
      }
      return slow;
    }
}

注意事项

问题3

找到两个单链表相交的起始节点,如果不相交返回为空。

原理

代码

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
       if(headA==null||headB==null){
           return null;
       }
       ListNode pa = headA;
       ListNode pb = headB;

       while(pa!=pb){
           pa = pa==null?headB:pa.next;
           pb = pb==null?headA:pb.next;
       }
       return pa;
    }
}

注意事项

上一篇下一篇

猜你喜欢

热点阅读