1. 程式人生 > >Leetcode演算法Java全解答--86. 分隔連結串列

Leetcode演算法Java全解答--86. 分隔連結串列

Leetcode演算法Java全解答–86. 分隔連結串列

文章目錄

題目

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

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

示例:

輸入: head = 1->4->3->2->5->2, x = 3
輸出: 1->2->2->4->3->5

想法

  1. 搞2個指標,第一個指標表示達標的最後一個值,第二個值用來遍歷整條連結串列,遍歷完也結束了

第一個指標表示達標的最後一個值:index1的前面的值都要小於x

  1. 使用2個連結串列,後面拼起來,在better方法裡面

結果

超過80%的測試案例

時間複雜度/空間複雜度:n/1

總結

程式碼

我的答案

    
public ListNode partition(ListNode head, int x) {
    if (head == null || head.next == null || head.next.next == null) {
        return head;
    }

    ListNode result = head;
    ListNode slow = head;
    ListNode fast = head.next;
    ListNode preNode = head;

    while (fast != null) {
        if (fast.val < x) {
            if (result.val >= x) {
                preNode.next = fast.next;
                fast.next = result;
                result = fast;
                fast = preNode.next;
                slow = result;
                continue;
            }

            if (slow.next.equals(fast)) {
                preNode = fast;
                fast = fast.next;
                slow = slow.next;
            } else {
                preNode.next = fast.next;
                fast.next = slow.next;
                slow.next = fast;
                // 前進
                fast = preNode.next;
                slow = slow.next;
            }

        } else {
            preNode = fast;
            fast = fast.next;
        }
    }
    return result;
}

大佬們的答案


    public ListNode better(ListNode head, int x) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode head1 = new ListNode(0), cur1 = head1, head2 = new ListNode(1), cur2 = head2;
        while (head != null) {
            if (head.val >= x) {
                cur2.next = head;
                head = head.next;
                cur2 = cur2.next;
                cur2.next = null;
            } else {
                cur1.next = head;
                head = head.next;
                cur1 = cur1.next;
                cur1.next = null;
            }
        }
        cur1.next = head2.next;
        return head1.next;
    }

測試用例

    
    @Test
    public void test086() {
        // 建立測試案例
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(4);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(2);
        ListNode listNode5 = new ListNode(5);
        ListNode listNode6 = new ListNode(2);
        listNode1.next = listNode2;
        listNode2.next = listNode3;
        listNode3.next = listNode4;
        listNode4.next = listNode5;
        listNode5.next = listNode6;
        int x1 = 3;

        // 測試案例期望值
        ListNode expResult11 = new ListNode(1);
        ListNode expResult12 = new ListNode(2);
        ListNode expResult13 = new ListNode(2);
        ListNode expResult14 = new ListNode(4);
        ListNode expResult15 = new ListNode(3);
        ListNode expResult16 = new ListNode(5);
        expResult11.next = expResult12;
        expResult12.next = expResult13;
        expResult13.next = expResult14;
        expResult14.next = expResult15;
        expResult15.next = expResult16;

        // 執行方法
        Solution086 solution086 = new Solution086();
        ListNode result1 = solution086.partition(listNode1, x1);

        // 判斷期望值與實際值
        Assert.assertEquals(expResult11.toArray(), result1.toArray());
    }


其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060