首页 > 其他 > 详细

LeetCode 61

时间:2020-04-22 20:07:02      阅读:46      评论:0      收藏:0      [点我收藏+]

https://leetcode-cn.com/problems/rotate-list/

这个题我先谈谈我自己的想法,先用快慢指针寻找向右移动第k次后的链表的头,然后让原链表的尾指向头,直接返回新的链表头即可,但是这样出现如果k比原链表长度大的情况,就是用判断,如果出循环后i不等于k,说明链表长度短了,需要重新判断。

判断方法为:如果k是链表长度的整数倍,直接返回原链表,否则的话就对原链表执行向右旋转k%i个位置的操作,i为链表长度。这样做打败79%的人。

技术分享图片技术分享图片
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode rotateRight(ListNode head, int k) {
        if(head == null || head.next == null || k == 0){
            return head;
        }
        ListNode dummy = new ListNode(-1);
        dummy.next = head;
        ListNode fast = head;
        ListNode slow = head;
        int i = 0;
        while(fast.next != null){
            if(i < k){
                fast = fast.next;
                i++;
                continue;
            }
            fast = fast.next;
            slow = slow.next;
        }
        if(i != k){
            if(k % (i+1) == 0){
                return dummy.next;
            }else{
                return rotateRight(dummy.next, k%(i+1));
            }
        }else{
            ListNode newHead = slow.next;
            slow.next = null;
            fast.next = dummy.next;
            return newHead;
        }
    }
}
View Code

后来一看评论区,发现我的解法还是too young。直接统计链表的长度,然后让他们首尾相连,在第k%i(i为链表长度)的地方断开,返回断开的下一个结点就可以了。

我是真的菜 TvT

LeetCode 61

原文:https://www.cnblogs.com/ZJPaang/p/12755407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!