题目:给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例1:
输入:[1,2,3,4,5]
输出:此列表中的结点 3 (序列化形式:[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意,我们返回了一个 ListNode 类型的对象 ans,这样:ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例2:
输入:[1,2,3,4,5,6]
输出:此列表中的结点 4 (序列化形式:[4,5,6])
由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。
提示:
给定链表的结点数介于 1 和 100 之间。
https://leetcode-cn.com/problems/middle-of-the-linked-list/
题目分析1:
对于本题,如果是一个普通数组,我们会想到先获取数组的长度,然后返回中间值。但是链表不能直接通过下标访问对应的元素,所以对链表进行遍历,将遍历到的元素依次放入到一个数组中。
import org.junit.Test;
public class demo {
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode middleNode(ListNode head) {
//声明一个数组(链表结点数介于1~100之间)
ListNode[] list = new ListNode[100];
int index = 0;
//将所有结点存放到数组中
while(head!=null) {
list[index++] = head;
head = head.next;
}
//返回中间结点
return list[index/2];
}
@Test
public void test876() {
ListNode six = new ListNode(6);
ListNode fifth = new ListNode(5,six);
ListNode fourth = new ListNode(4,fifth);
ListNode third = new ListNode(3,fourth);
ListNode second = new ListNode(2,third);
ListNode head = new ListNode(1,second);
middleNode(head);
}
}
题目分析2:
对于该题来说,可以使用快慢指针法,设置两个初始指向head的指针,两个指针一起遍历链表,慢指针一次走一步,快指针一次走两步,当快指针走到链表末尾时,慢指针刚好在链表中间。
import org.junit.Test;
public class demo876 {
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode middleNode(ListNode head) {
//初始化快慢指针均为head
ListNode slow = head;
ListNode fast = head;
//慢指针移动一步,快指针移动两步
while(fast!=null && fast.next!=null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
@Test
public void test876() {
ListNode six = new ListNode(6);
ListNode fifth = new ListNode(5,six);
ListNode fourth = new ListNode(4,fifth);
ListNode third = new ListNode(3,fourth);
ListNode second = new ListNode(2,third);
ListNode head = new ListNode(1,second);
middleNode(head);
}
}
自己在做题时没有想到使用快慢指针的算法,后来看到题解中快慢指针的算法,真秀呀!