86. 分隔連結串列(Java)

小劉快去學習8發表於2021-01-03

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;

    }
}

在這裡插入圖片描述

相關文章