LeedCode--【86】【分割連結串列】
阿新 • • 發佈:2018-11-17
一、原題要求:
給定一個連結串列和一個特定值 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"); } }