给定一个未知长度的单链表,快速求得其中间节点
示例:输入:1->3->5->3->9
输出:5
思路
普通解法:要找到中间结点,首先想到的是通过遍历链表,得到链表的长度。再次遍历链表,找到长度一半的位置,即为解。时间复杂度为O(3/2N)
快慢指针法:定义两个指针p1,p2,均指向头结点。我们让p2的移动速度是p1的两倍。当p2指向尾结点时,p1指向的即为中间结点。时间复杂度为O(1/2N)
解:(快慢指针)
class Solution {
public:
int findMidNode(ListNode *L) {
ListNode *p1=L->next; //链表包含头结点
ListNode *p2=L->next;
while(p2->next!=NULL){
if(p2->next->next!=NULL) {
p2 = p2->next->next;
p1 = p1->next;
}
else
p2=p2->next;
}
return p1->val;
}
};
网友评论