[程式設計題]按照左右半區的方式重新組合單鏈表
時間限制: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...