力扣演算法題 143 重排鍊錶 C語言實現

2021-10-25 00:05:40 字數 1613 閱讀 4229

給定乙個單鏈表 l:l0→l1→…→ln-1→ln ,

將其重新排列後變為: l0→ln→l1→ln-1→l2→ln-2→…

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。

示例 1:

給定鍊錶 1->2->3->4, 重新排列為 1->4->2->3.

示例 2:

給定鍊錶 1->2->3->4->5, 重新排列為 1->5->2->4->3.

第一種思路:雙重迴圈,每次尋找末尾節點都重新遍歷一次

1、先獲取鍊錶長度,根據長度算出中點;

2、遍歷到中點的所有節點,找出對應的末端節點,進行連線即可;

思路比較簡單,用時較長;

第二種思路:

1、將節點存入陣列中;

2、根據陣列位置,重新連線鍊錶;

思路比較簡答,用時較短;

思路1:不借助別的空間,每次尋找末尾節點都重新遍歷一次

/**

* definition for singly-linked list.

* struct listnode ;

*/void

reorderlist

(struct listnode* head)

/*若節點長度小於等於2,則直接返回*/

if(inodelen <=2)

return

;

node = head;

/*遍歷節點到中點位置停止*/

for(i=1;

(inodelen-1)

/2-i>=

0;i++

) node->next = rnode;

rnode->next = next;

node = next;

}/*清空最後乙個節點的指向*/

if(inodelen-2*

(i-1)==

1)else

}

思路2:借助陣列,重建鍊錶

/**

* definition for singly-linked list.

* struct listnode ;

*/void

reorderlist

(struct listnode* head)

if(inodelen <=2)

return

;/*宣告初始化陣列*/

struct listnode*

* a=

malloc

(sizeof

(struct listnode*

)*inodelen)

;/*陣列賦值*/

node = head;

for(i=

0;node !=

null

;i++

)/*依據陣列重新連線鍊錶*/

node = head;

for(i=1;

(inodelen-1)

/2-i>=

0;i++

)/*鍊錶末尾指向置空*/

if(inodelen-2*

(i-1)==

1)else

}

143 重排鍊錶

143.重排鍊錶 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 ...

143 重排鍊錶

題解 時間複雜度 o n 空間複雜度 o n definition for singly linked list.struct listnode listnode int x val x next nullptr listnode int x,listnode next val x next nex...

143 重排鍊錶

題目 給定乙個單鏈表 l l0 l1 l n 1 ln 將其重新排列後變為 l0 l n l1 l n 1 l2 l n 2 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。示例 1 給定鍊錶 1 2 3 4,重新排列為 1 4 2 3.示例 2 給定鍊錶 1 2 3 4 5,重新排列...