目录
题目
Given a non-empty, singly linked list with head node head
, return a middle node of linked list.
If there are two middle nodes, return the second middle node.
Example 1:
Input: [1,2,3,4,5]
Output: Node 3 from this list (Serialization: [3,4,5])
The returned node has value 3. (The judge's serialization of this node is [3,4,5]).
Note that we returned a ListNode object ans, such that:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL.
Example 2:
Input: [1,2,3,4,5,6]
Output: Node 4 from this list (Serialization: [4,5,6])
Since the list has two middle nodes with values 3 and 4, we return the second one.
Note:
- The number of nodes in the given list will be between
1
and100
知识点
“ / ” 为浮点数除法,返回浮点结果
“ // ” 表示整数除法,返回不大于结果的一个最大整数
解法
解法一:
快慢指针,我起了个名字叫快慢小马
def middleNode(head: ListNode) -> ListNode:
slow=head
fast=head
if(head.next is None):
return head
while(True):
if(fast.next is None):
return slow
fast=fast.next
slow = slow.next
if (fast.next is None):
return slow
fast=fast.next
解法二:
高赞评论里,代码更简洁
def middleNode(self, head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
解法三:
先数一下有多少个元素
def middleNode(head: ListNode) -> ListNode:
i=0
index=head
while(index):
i=i+1
index=index.next
location=int((i/2))
for j in range(location):
head=head.next
return head
解法四:
把链表里的节点放到数组里,这样会占用额外的空间
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
arr = [head]
while arr[-1].next:
arr.append(arr[-1].next)
return arr[len(arr) // 2]