题目
分析
三指针法,具体见代码,需要注意如果出现不是三的倍数个数的链表,需要问面试官怎么分,一般不是三的倍数的等分要求三个链表个数都最接近,比如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;
}
}