Open azl397985856 opened 2 months ago
链表求中间值,那么就两个指针,一个指针跨2步,一个指针跨1步,当跨2步的指针到头之后,那么跨一步的指针正好指向中间。
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var middleNode = function (head) {
let [p1, p2] = [head, head];
while (p2 && p2.next) {
p1 = p1.next;
p2 = p2.next.next;
}
return p1;
};
def middleNode(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
思路:
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* preH = new ListNode(0);
ListNode* slow = preH;
ListNode* fast = preH;
preH->next = head;
while(fast->next!=nullptr&&fast->next->next!=nullptr){
slow=slow->next;
fast=fast->next;
fast=fast->next;
}
return slow->next;
}
};
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast, slow = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
Time O(N) Space O(1)
快慢指针,快指针走两步,慢指针走一步,直到快指针不能再走两步。如果停止时快指针后面没有节点,说明链表中有奇数个节点,此时慢节点为中间节点;如果停止时快指针后面还有一个节点,说明链表中有偶数个节点,此时慢节点为第一个中间节点,因此返回慢节点的下一个节点。
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
fast,slow = head,head
while fast.next and fast.next.next:
fast = fast.next.next
slow = slow.next
if not fast.next:
return slow
return slow.next
时间复杂度o(n) 需要遍历链表,n为链表中节点个数
空间复杂度o(1)
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
时间复杂度 O(N) 空间复杂度 不使用额外空间
思路: 快慢指针 代码:
class Solution:
def middleNode(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head.next is None:
return head
slow = head
fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
时间复杂 O(n) 空间复杂 O(1)
class Solution { public: ListNode middleNode(ListNode head) { ListNode slow=head, fast=head; while(fast != nullptr && fast->next != nullptr){ fast = fast->next->next; slow = slow->next; } return slow; } };
var middleNode = function (head) {
if (!head || !head.next) {
return head;
}
slow = head;
fast = head;
while (fast) {
if (fast.next) {
fast = fast.next.next;
} else {
fast = fast.next;
break;
}
slow = slow.next;
}
return slow;
};
时间复杂度花费在遍历链表上,故 O(N)
876. 链表的中间结点
入选理由
暂无
题目地址
https://leetcode-cn.com/problems/middle-of-the-linked-list/
前置知识
暂无
题目描述