题目描述:
给定一个带有头结点 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,我们返回第二个结点。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思想:
用C++可以用快慢指针的方法来解决,快指针一次走两步,慢指针一次走一步,这样当快指针指到了末尾的时候,慢指针就到中间结点了,直接返回慢指针指向的结点就可以了
用Java解决这个题可以直接用LinkedList,每次把cur加入到list集合中,最后直接用返回list.get(list.size() / 2)就可以了。在这里需要提及一下list.get(i)返回来的是list集合中第 i + 1个元素
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* middleNode(ListNode* head) { if(head == nullptr) { return nullptr; } ListNode* fast = head; ListNode* slow = head; while(fast != nullptr && (fast->next) != nullptr){ fast = fast->next->next; slow = slow->next; } return slow; } };
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode middleNode(ListNode head) { List<ListNode>list = new LinkedList <ListNode>(); ListNode cur = head; while(cur != null){ list.add(cur); cur = cur.next; } return list.get(list.size()/2); } }