LeetCode (링크) - 725. 분할 링크

6275 단어 알고리즘
제목.
헤드 노드 를 루트 로 하 는 링크 를 지정 하고 링크 를 k 개의 연속 부분 으로 구분 하 는 함 수 를 만 듭 니 다.각 부분의 길 이 는 가능 한 한 같 아야 한다. 임의의 두 부분의 길이 차 이 는 1 을 초과 해 서 는 안 된다. 즉, 일부 부분 은 null 일 수 있다.이 k 부분 은 링크 에 나타 난 순서에 따라 출력 해 야 하고 앞 에 있 는 부분의 길 이 는 뒤의 길이 보다 크 거나 같 아야 한다.위 규칙 에 맞 는 링크 목록 을 되 돌려 줍 니 다.
예: 1 - > 2 - > 3 - > 4, k = 5 / / 5 결과 [1], [2], [3], [4], null]
예제 1: 입력: root = [1, 2, 3], k = 5 출력: [1], [2], [3], [], [] 설명: 입 출력 각 부분 은 배열 이 아 닌 링크 여야 합 니 다.예 를 들 어 입력 한 노드 루트 의 val = 1, root. next. val = 2, \ root. next. next. val = 3, 그리고 root. next. next. next = null.첫 번 째 출력 output [0] 은 output [0]. val = 1, output [0]. next = null 입 니 다.마지막 요소 output [4] 는 null 입 니 다. 마지막 부분 은 빈 링크 입 니 다.
예제 2: 입력: root = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], k = 3 출력: [1, 2, 3, 4], [5, 6, 7], [8, 9, 10] 설명: 입력 은 몇 개의 연속 적 인 부분 으로 나 뉘 었 고 각 부분의 길이 차 이 는 1 을 초과 하지 않 았 다. 앞부분 의 길 이 는 뒷부분 의 길이 보다 크다.
생각:
1. 먼저 링크 를 옮 겨 다 니 며 개수 count 2. count / k 는 각 부분 에 몇 개가 있 을 수 있 는 지, count% k 는 앞의 몇 부분 에 하나 가 더 있 을 수 있 음 을 나타 낸다. 3. 2 층 순환 을 이용 하여 링크 배열 을 옮 겨 다 닐 수 있다.
코드:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode[] splitListToParts(ListNode root, int k) {
        ListNode head = root;
		int count = 0;  //    
		while(head != null) {
			count++;
			head = head.next;
		}
		int p = count/k;  //           
		int rem = count%k; //              
		
		ListNode[] ans = new ListNode[k];  //       
		head = root;
		
		for(int i = 0; i < k; i++) {
			ListNode tmp = new ListNode(-1);
			ListNode write = tmp;
			for(int j = 0; j < p+(i<rem?1:0); j++) { //     rem  
				write.next = new ListNode(head.val);
				write = write.next;
				head = head.next;
			}
			ans[i] = tmp.next;
		}
		
		
		return ans;
    }
}

좋은 웹페이지 즐겨찾기