1. 程式人生 > >LeedCode--【86】【分割連結串列】

LeedCode--【86】【分割連結串列】

一、原題要求:

給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

你應當保留兩個分割槽中每個節點的初始相對位置。

示例:

/**
 * 題目要求:
 * <p>
 * 給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
 * 你應當保留兩個分割槽中每個節點的初始相對位置。
 * <p>
 * 示例:
 * <p>
 * 輸入: head = 1->4->3->2->5->2, x = 3
 * 輸出: 1->2->2->4->3->5
 * <p>
 * 解題思路:
 * 建立兩個連結串列a,b,將原來連結串列中的每個結點,小於等於x的結點放在a連結串列的末尾,如果是大於就放在b的
 * 末尾,最後將b的頭結點接到a末尾。
 */

二、程式碼實現:

class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }
}

class Solution1 {
    public ListNode partition(ListNode head, int x) {

        ListNode min = new ListNode(0); // 小於x的連結串列
        ListNode max = new ListNode(0); // 大於等於x的連結串列
        ListNode t1 = min;
        ListNode t2 = max;
        ListNode p = head;

        while (p != null) {
            if (p.val < x) { // 如果該節點值比 x 小,就放在min連結串列中
                t1.next = p;
                t1 = p;
            } else { // 如果該節點值比 x 大,就放在max連結串列中
                t2.next = p;
                t2 = p;
            }
            p = p.next;
        }

        t2.next = null; // 讓數值大的連結串列最後指向空

        // 說明小於的連結串列上有資料
        if (t1 != min) {
            t1.next = max.next;
            return min.next;
        } else {
            return max.next;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        ListNode n1 = new ListNode(1);
        ListNode n2 = new ListNode(4);
        ListNode n3 = new ListNode(3);
        ListNode n4 = new ListNode(2);
        ListNode n5 = new ListNode(5);
        ListNode n6 = new ListNode(2);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        n5.next = n6;
        System.out.println("初始連結串列:");
        print(n1);

        Solution1 solution = new Solution1();
        System.out.println("最終連結串列:");
        print(solution.partition(n1, 4));
    }

    public static void print(ListNode head) {
        for (ListNode temp = head; temp != null; temp = temp.next) {
            System.out.print(temp.val + "->");
        }
        System.out.println("null");
    }
}