Version 1
private ListNode findMiddle(ListNode head) {
if (head == null) {
return null;
}
ListNode slow = head, fast = head.next;
while (fast != null && fast.next != null) {
fast = fast.next.next; // fast可以为null
slow = slow.next;
}
return slow;
}
Version 2
private ListNode findMid(ListNode head) {
if (head == null) {
return head;
}
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next; // fast不能为null
}
return slow;
}
Version 3
private ListNode findMid(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next; // fast不能为null
}
return slow;
}
V1 V2 V3
0 -> 0,0 0,0 0,0
1 -> 1,0 1,0 1,0
2 -> 1,1 1,1 2,0
3 -> 2,1 2,1 2,1
4 -> 2,2 2,2 3,1
5 -> 3,2 3,2 3,2
6 -> 3,3 3,3 4,2
...
结论:
1、Version 3 是错误的
2、Version 1 和Version 2 效果完全相同,第一个子链长度大于等于第二个子链,都对
3、推荐Version 2