4.快速找到未知长度单链表的中间结点(C++)

给定一个未知长度的单链表,快速求得其中间节点

示例:输入: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;
}
};

你可能感兴趣的:(4.快速找到未知长度单链表的中间结点(C++))