《雙指標》86 分隔鍊錶《leetcode》

2021-10-10 13:42:59 字數 984 閱讀 9511

難度中等279

給定乙個鍊錶和乙個特定值x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。

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

示例:

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

輸出: 1->2->2->4->3->5

建立兩個頭節點beforehead,afterhead,分別用來儲存val比x小的節點,和大於等於val的節點。

然後通過head鍊錶,比x小就放在before後面,即before.next=head;反之,放在after後面,即after.next=head  

往前走,直到head=null

之後,before.next=afterhead.next  把兩個鍊錶接一下, 最後 after.next=null 防止出現迴圈。

總體來講只申請了beforehead afterhead兩個空間,所以空間複雜度為o(1),時間複雜度為o(n)。

/*** definition for singly-linked list.

* public class listnode

* }*/class solution {

public listnode partition(listnode head, int x) {

listnode beforehead=new listnode(0);

listnode before=beforehead;

listnode afterhead=new listnode(0);

listnode after=afterhead;

while(head!=null)

{if(head.val本來第一想法是採用一遍的快速排序的,但是很明顯需要改變鍊錶的資料結構,形成雙向鍊錶,耗費會比較多,因而放棄了,但是不失為一種可行的方法。

快排思想的話可以參考一下這篇部落格。

86 分隔鍊錶

給定乙個鍊錶和乙個特定值x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3輸出 1 2 2 4 3 5 definition for singly linked list.st...

86 分隔鍊錶

給定乙個鍊錶和乙個特定值 x,對鍊錶進行分隔,使得所有小於 x 的節點都在大於或等於 x 的節點之前。你應當保留兩個分割槽中每個節點的初始相對位置。示例 輸入 head 1 4 3 2 5 2,x 3 輸出 1 2 2 4 3 5 方法 遍曆法 思路 定義兩個新鍊錶,head鍊錶逐個開頭遍歷,大於等...

86 分隔鍊錶

本來想用快慢指標做的,就像面試題02.04,交換節點的值,但是這樣不能保證每個結點的初始相對位置,於是就只能構造兩個鍊錶large和small,分別存放大於x的節點和小於x的節點,再把兩個鍊錶拼接起來。definition for singly linked list.struct listnode...