百度面试:环形链表分成三等份

题目

在这里插入图片描述
在这里插入图片描述

分析

三指针法,具体见代码,需要注意如果出现不是三的倍数个数的链表,需要问面试官怎么分,一般不是三的倍数的等分要求三个链表个数都最接近,比如11个节点,三个链表节点个数应该是4,4,3,10个节点,链表的个数应该是3,3,4,具体详细见代码,等分时需要除以三并四舍五入,比如11除以3四舍五入是4.

代码

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class GetThreeListNode {
    public static void main(String[] args) {
        ListNode l1 = new ListNode(1);
        ListNode l2 = new ListNode(2);
        ListNode l3 = new ListNode(3);
        ListNode l4 = new ListNode(4);
        ListNode l5 = new ListNode(5);
        ListNode l6 = new ListNode(6);
        ListNode l7 = new ListNode(7);
        ListNode l8 = new ListNode(8);
        ListNode l9 = new ListNode(9);
        ListNode l10 = new ListNode(10);
        ListNode l11 = new ListNode(11);
        l1.next = l2;
        l2.next = l3;
        l3.next = l4;
        l4.next = l5;
        l5.next = l6;
        l6.next = l7;
        l7.next = l8;
        l8.next = l9;
        l9.next = l10;
        l10.next = l11;
        l11.next = l1;
        List<ListNode> threeListNode = getThreeListNode(l1);

        // 打印
        for(int i = 0; i < threeListNode.size(); i++){
            ListNode head = threeListNode.get(i);
            System.out.println("链表 i = " + i);
            while(head != null){
                System.out.println(head.val);
                head = head.next;
            }
        }
    }
    public static List<ListNode> getThreeListNode(ListNode head){
        if(head==null){
            List<ListNode> list = new ArrayList<>();
            list.add(null);
            list.add(null);
            list.add(null);
            return list;
        }
        ListNode l1 = head;
        ListNode l2 = head.next;
        ListNode l3 = head.next.next;
        int count =1;
        ListNode temp = head;
        while (head.next!=temp){
            count++;
            head = head.next;
        }
        if (count==1){
            List<ListNode> list = new ArrayList<>();
            temp.next = null;
            list.add(temp);
            list.add(null);
            list.add(null);
            return list;
        }
        if(count == 2){
            List<ListNode> list = new ArrayList<>();
            ListNode a =temp.next;
            temp.next = null;
            list.add(temp);
            a.next = null;
            list.add(a);
            list.add(null);
            return list;
        }
        System.out.println(count);
        List<ListNode> list= new ArrayList<>();
        if((count%3)==0){
            while(l3.next!=temp){
                l3 = l3.next.next.next;
                l2 = l2.next.next;
                l1 = l1.next;
            }
            ListNode a1 = l3.next;
            ListNode a2 = l2.next;
            ListNode a3 = l1.next;
            l1.next = null;
            l2.next = null;
            l3.next = null;
            list.add(a1);
            list.add(a2);
            list.add(a3);
        }else{
            int k = (int) Math.round(count*1.0/3)-1;
            while (k!=0){
                l2 = l2.next.next;
                l1 = l1.next;
                k--;
            }
            while(l3.next!=temp){
                l3 = l3.next;
            }
            ListNode a1 = l3.next;
            ListNode a2 = l2.next;
            ListNode a3 = l1.next;
            l1.next = null;
            l2.next = null;
            l3.next = null;
            list.add(a1);
            list.add(a3);
            list.add(a2);
        }


        return list;
    }
}

在这里插入图片描述

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙崎流河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值