leetcode#141 Linked List Cycle

Given a linked list, determine if it has a cycle in it.

solve it without using extra space.

解释:

给定一个链表,判断链表是否有环。(最好不使用额外的存储空间)

理解:

本题的链表中的每一个节点只有一个next ,即每一个节点连接的下一个节点是为唯一的,不会出现分支。只是不知道如果出现环路,环路的起止点是哪一个节点。

我的解法:

既然是单链表,那么就设置两个指针slowfast ,都用于遍历链表的所有节点,其中slow 每次移动一个节点的位置,fast 每次移动两个节点的位置,如果不存在环路,则fast 将在之后的遍历中永远不会与slow 相遇,并最后到达链表的末尾;如果存在环路,则两个不同遍历速度的指针肯定会在某一个时间相遇,即slow = fast

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if(slow == fast) {
break;
}
}
return (fast == null || fast.next == null)? false : true;
}
}
大神解法:

基本思路都是相同的。

1
2
3
4
5
6
7
8
9
10
11
public boolean hasCycle(ListNode head) {
if(head==null) return false;
ListNode walker = head;
ListNode runner = head;
while(runner.next!=null && runner.next.next!=null) {
walker = walker.next;
runner = runner.next.next;
if(walker==runner) return true;
}
return false;
}

总结:

本题可以形象地用赛跑来描述:如果跑直线,那么跑得慢的人将永远追不上跑得快的人,两人也就永远不会相遇;如果跑圈,那么跑的快的人将在某一时间追上跑得慢的人,两人将在未来的某一个时间点相遇。