于2021.11.19练习
题目链接
1.1 解法1:两次遍历
思路:第一次遍历获取链表的长度length;那么length/2就对应着中间结点在链表中的索引(对于奇数个元素中间结点正好是中间值,对于偶数个元素中间结点是后面的那个值),于是第二次遍历,找到这个中间结点。
class Solution {
public ListNode middleNode(ListNode head) {
int length = getLength(head);
ListNode cur = head;
for(int i = 0;i < length/2;i++){
cur = cur.next;
}
return cur;
}
public int getLength(ListNode head){
int length = 0;
while(head != null){
length++;
head = head.next;
}
return length;
}
}
1.2 解法2:快慢指针
思路:类似于148链表的归并排序寻找链表的中点。主要是利用了快慢指针,快指针每次走2步,而慢指针每次走1步,当快指针走到头时,那么慢指针刚好走到中点,于是可以找到中间结点。
class Solution {
public ListNode middleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
小思考:可以回顾下leetcode148.排序链表使用归并排序的方法,因为归并排序中就需要找到待排序序列的中点并一分为二。