86. 分隔連結串列(Java)
阿新 • • 發佈:2021-01-04
86. 分隔連結串列
給你一個連結串列和一個特定值 x ,請你對連結串列進行分隔,使得所有小於 x 的節點都出現在大於或等於 x 的節點之前。
你應當保留兩個分割槽中每個節點的初始相對位置。
思路:
該連結串列沒有頭結點,加上一個頭結點方便插入和刪除
遍歷連結串列(結束條件為p!=null)
1)找到第一個不小於x的節點X並記錄位置
2)X前的所有節點不需要改變
3)X後所有值小於x的節點均需按照與按原順序插入到節點X之前
時間複雜度:遍歷一次連結串列 O(N)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
//找到第一個>=x的節點位置P,將其後<=x的節點按照原來的順序插入P之前
//該連結串列不包含頭結點,先給該連結串列加一個頭結點方便插入
ListNode new_head=new ListNode(Integer.MAX_VALUE);
new_head.next=head;
ListNode pre=new_head,p=new_head.next;
while(p!=null && p. val<x) {
pre=p;
p=p.next;
}
ListNode new_pre=pre,new_p=p;
while(new_p!=null) {
if (new_p.val<x) {
//將當前節點插入到第一個>=x的節點之前
new_pre.next=new_p.next;
pre.next=new_p;
new_p.next=p;
//更新第一個>x節點的前驅節點
pre=pre.next;
//繼續向後遍歷
new_p= new_pre.next;
continue;
}
new_pre=new_p;
new_p=new_p.next;
}
return new_head.next;
}
}