Leetcode演算法Java全解答--86. 分隔連結串列
阿新 • • 發佈:2018-12-26
Leetcode演算法Java全解答–86. 分隔連結串列
文章目錄
題目
給定一個連結串列和一個特定值 x,對連結串列進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
示例:
輸入: head = 1->4->3->2->5->2, x = 3 輸出: 1->2->2->4->3->5
想法
- 搞2個指標,第一個指標表示達標的最後一個值,第二個值用來遍歷整條連結串列,遍歷完也結束了
第一個指標表示達標的最後一個值:index1的前面的值都要小於x
- 使用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