leedcode做题总结,题目Linked List Cycle I/II 13/10/28-30

来源:互联网 发布:广州云计算培训 编辑:程序博客网 时间:2024/05/16 23:44

这两道题很简单,思路都是两个节点从head开始,一个一次走一步,另一个走两步,如果遇到了就说明有循环。


第二题是要寻找循环的开始,由于在一个环中,如果两个节点一个一次1步,另一个一次2步,则他们永远在环的某个固定节点相遇。所以我们把换前面的链扳弯贴合在环上,则链表头的位置即为环中两点相遇的地方。所以此点到环开始的地方和链表头到环开始的地方的距离是相同的,所以先找到相遇点,再将其中一个移到链表头,同时以1次1步前进,则会在环的开端相遇。


    public ListNode detectCycle(ListNode head) {        if (head==null)return null;        ListNode m = head;        ListNode n = head;        while (true){            if (m.next==null) return null;            if (n.next==null) return null;            if (n.next.next==null) return null;            m=m.next;            n=n.next.next;            if(m.equals(n))break;        }        m=head;        while (!m.equals(n)){            m=m.next;            n=n.next;        }        return m;    }


0 0
原创粉丝点击