演算法題 按照左右半區的方式重新組合單鏈表

2021-08-20 14:34:02 字數 2238 閱讀 3889

[程式設計題]按照左右半區的方式重新組合單鏈表

時間限制:1秒 空間限制:32768k

給定乙個單鏈表的頭部節點head,鍊錶長度為n。 如果n為偶數,那麼前n/2個節點算作左半區,後n/2個節點算作右半區; 如果n為奇數,那麼前n/2個節點算作左半區,後n/2+1個節點算作右半區; 左半區從左到右依次記為l1->l2->…,右半區從左到右依次記為r1->r2->…。請將單鏈表調整成l1->r1->l2->r2->…的樣子。 例如: 1->2->3->4 調整後:1->3->2->4 1->2->3->4->5 調整後:1->3->2->4->5 要求:如果鍊錶長度為n,時間複雜度請達到o(n),額外空間複雜度請達到o(1)

思路:

建立乙個新vector,先將整個鍊錶push_back如心得vector中,同時將其按下標分成左右兩個鍊錶,從前到後逐個判斷」鍊錶」(實則已是在vector中操作)從頭到尾的第奇數還是偶數字,vector的奇數字插入原鍊錶右側元素,偶數為插入原鍊錶左側元素,直到鍊錶(vector)結束;

/*

* 按照左右半區的方式重新組合單鏈表

* 輸入:乙個單鏈表的頭節點head

* 將鍊錶調整成題目要求的樣子

*/class solution

};*/

void relocatelist(struct listnode* phead)

pointer = phead;

int indexofvector = 0;

int indexofleft = 0;

int indexofright = vector.size() / 2;

while (indexofvector1 && pointer != null)

else

if (indexofvector % 2 != 0)

++indexofvector;}}

};

解法2

class solution 

vector

vec ;

p = head ;

for ( int i = 0; i < length; ++ i )

p = head ;

int left_cur = 0 ;

int right_cur = length / 2 ;

int index = 0 ;

while( index < vec.size() - 1 && p != null )

else

p = p->next ;

++ index ;}}

};

【基本思路】

先遍歷一遍找到左半區的最後乙個節點,然後將鍊錶分成左右兩部分,在按照題目要求重新合併即可。

如何找到左半區的最後乙個節點?

例如:1 -> 2,mid為1;

1 -> 2 -> 3,mid為2;

1 -> 2 -> 3 -> 4,mid為2;

1 -> 2 -> 3 -> 4 -> 5,mid為3;

1 -> 2 -> 3 -> 4 -> 5 -> 6,mid為3;

也就是說,從長度為2開始,長度每增加2,mid就往後移動乙個節點。

python實現

#python3.5

def recombination(head):

if head == none or head.next == none:

return head

mid = head

right = head.next

while

right.next != none and

right.next.next != none:

mid = mid.next

right = right.next.next

right = mid.next

mid.next = none

cur = head

while cur.next != none:

rightnext = right.next

right.next = cur.next

cur.next = right

cur = right.next

right = rightnext

cur.next = right

return head

python解法參考

按照左右半區的方式重新組合單鏈表

題目 給定乙個單鏈表的頭部節點head,鍊錶長度為n 如果n為偶數,那麼前n 2個節點算作左半區,後n 2個節點算作右半區 如果n為奇數,那麼前n 2個節點算作左半區,後n 2 1個節點算作右半區。左半區從左到右依次記為l1 l2 右半區從左到右依次記為r1 r2 請將單鏈表調整成l1 r1 l2 ...

演算法總結之 按照左右半區的方式重新組合單鏈表

把鍊錶右邊的 拿過來以此插入到左邊的鍊錶 思路 如果鍊錶長度為n,直接給出時間複雜度為o n 額外空間複雜度為o 1 的方法 1 如果鍊錶為空,或者長度為1 不調整 2 鍊錶長度大於1時,遍歷一便找到左半區最後乙個節點 記為mid package tt public class test115 pu...

鍊錶問題20 按照左右半區的方式重新組合單鏈表

給定乙個單鏈表的頭部節點head,鍊錶長度為n,如果n為偶數,那麼前n 2個節點算作左半區,後n 2個節點算作右半區 如果n為奇數,那麼前n 2個節點算作左半區,後n 2 1個節點算作右半區。左半區從左到右依次為l1 l2 l3 右半區從左到右依次記為r1 r2 請將單鏈表調整成l1 r1 l2 r...