leetcode:旋转链表 && leetcode:不一样的路径

旋转链表:题目描述

给定一个链表,旋转链表,将链表每一个节点向右移动 k 个位置,其中 k 是非负数。web

示例 1:svg

输入: 1->2->3->4->5->NULL, k = 2
输出: 4->5->1->2->3->NULL
解释:
向右旋转 1 步: 5->1->2->3->4->NULL
向右旋转 2 步: 4->5->1->2->3->NULL
示例 2:指针

输入: 0->1->2->NULL, k = 4
输出: 2->0->1->NULL
解释:
向右旋转 1 步: 2->0->1->NULL
向右旋转 2 步: 1->2->0->NULL
向右旋转 3 步: 0->1->2->NULL
向右旋转 4 步: 2->0->1->NULLcode

解题思路

  1. 计算链表的节点个数
  2. 将最后一个节点的下一个指针指向头结点
  3. 对k取链表节点个数的模
  4. 将指针移动到倒数第k个节点的上一个节点
  5. 倒数第k个节点即为头结点
  6. 倒数第k个节点的上一个节点为尾节点
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* rotateRight(ListNode* head, int k) {
       if(head == nullptr) return head;
        int len = 1;
        ListNode *p = head;
        while(p->next != nullptr){
            len++;
            p = p->next;
        }
        p->next = head;
        p = head;
        
        k = k % len;
        while(--len > k)
            p = p->next;
        
        head = p->next;
        p->next = nullptr;     
        
        return head;
    }
};

不一样的路径:题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。xml

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。递归

问总共有多少条不一样的路径?it

解题思路

第一种方法:
利用递归的方法,可是这种方法超出了时间的限制io

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m == 0 || n == 0) return 0;
        if(m == 1 || n == 1) return 1;
        return uniquePaths(m - 1,n) + uniquePaths(m, n - 1);
    }
};

第二种方法:
利用空间换时间,采用动态规划的方法class

class Solution {
public:
    int uniquePaths(int m, int n) {
        if(m == 0 || n == 0) return 0;
        vector<vector<int>> dp(m,vector<int>(n,1));
        for(int i = 1; i < m; i++){
            for(int j = 1; j < n; j++)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        }
        
        return dp[m - 1][n - 1];
        
    }
};