leetcode之快慢指针

什么是快慢指针?

其实快慢指针类似于走路的速度,快指针走得比较快每次可以走2步,慢指针走得比较慢每次走一步,通常用来判断

判断单链表是否存在环,在有序链表中寻找中位数等等

leetcode-环形链表

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾
连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。

示例 1:
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

leetcode之快慢指针_第1张图片

代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) {
    struct ListNode *L1,*L2;
    L1=head;
    L2=head;
    if(head==NULL)return false;
    while((L1->next!=NULL)&&(L2->next!=NULL)&&(L2->next->next!=NULL))
    {
        L1=L1->next;
        L2=L2->next;
        L2=L2->next;
        if(L1->val==L2->val)return true;
    }
    return false;
}

 

leetcode-快乐数

编写一个算法来判断一个数是不是“快乐数”。

一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字
的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。
如果可以变为 1,那么这个数就是快乐数。

示例: 

输入: 19
输出: true
解释: 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

代码:

int mansum(int m)
{
    int number=0;
    while(m>0)
    {
        number=number+((m%10)*(m%10));    
        m=m/10;
    }
    return number;
}
int fastsum(int m)
{
    int number=0;
    while(m>0)
    {
        number=number+((m%10)*(m%10));
        m=m/10;
    }
    return number;
}
bool isHappy(int n) {
    int x=n,y=n;
    while(1)
    {
        x=mansum(x);
        y=fastsum(y);
        y=fastsum(y);
        if(x==y)break;
    }
    return x==1;
    
}
 假设快指针的移动速度是慢指针移动速度的2倍,因此当快指针到达链表尾时,慢指针到达中点。
外加考虑链表结点个数的奇偶数,当快指针移动x次后到达表尾(1+2x),说明链表有
奇数个结点,直接返回慢指针指向的数据即可。如果快指针是倒数第二个结点,说明
链表结点个数是偶数,这时可以根据需要的返回即可。
while (fast && slow)
{
  if (fast->next==NULL)
      return slow ->data;
  else if (fast->next!= NULL && fast->next->next== NULL)
      return (slow ->data + slow ->next->data)/2;
  else
  {
      fast= fast->next;
      fast= fast->next;
      slow = slow ->next;
  }
 }

 

你可能感兴趣的:(leetcode之快慢指针)