輸入:1->2->3->4->5->6->7
輸出:1->7->2->6->3->5->4
或者輸入:1->2->3->4->5->6
輸出:1->6->2->5->3->4
思路:
1. 將1->2->3->4->5->6->7分成:1->2->3 與 4->5->6->7,將後半部分逆序7->6->5->4
2. 合併1->2->3與7->6->5->4 為1->7->2->6->3->5->4
3. 劃分:就是找到中間節點mid,作為後半部分的頭節點(注意後半部分的節點數量會比前半部分多0個或者1個節點),這裡引入了slow與fast兩個外部變數,fast一次走2步,slow一次走一步,這樣fast走完時,slow正好走了一半,從而找到中間節點,同時,還需引入slow_pre外部變數,作為slow的前乙個節點,目的是為了找到中間節點的slow時,通過slow_pre.next = none的方式,斷開鍊錶,分成2個鍊錶
4. 逆序:輸入後半段的頭節點,也就是mid,實現對鍊錶逆序操作,可參考之前的文章,此處採用插入法逆序(鍊錶逆序)
5. 合併:引入外部變數cur1, cur2用來操作兩個鍊錶,每個節點仍然是2次指標操作,但要注意,每節點指標操作結束後,需要將外部操作變數cur下移。最後當cur1遍歷結束,即cur1.next為none時,跳出迴圈,將cur1.next指向cur2,cur2為最後乙個節點。
**:
def find_mid_node(head):
# 頭節點為空,或者鍊錶為單節點,直接返回
if head is none or head.next is none:
return head
fast = head
slow = head
slow_pre = head
while fast is not none and fast.next is not none:
slow_pre = slow
slow = slow.next # 每次移動1個節點,當fast結束時,slow走了一半
fast = fast.next.next # 每次隔乙個賦值,一步走2個節點
# 需要把指向slow的指標斷了,這樣才能變成兩個鍊錶,即slow前乙個節點的next指標為空
slow_pre.next = none
return slow # slow走了鍊錶的一半,返回的值就是中間節點mid
def reverse(head):
if head is none or head.next is none:
return head
cur = head
pre = none
while cur:
nex = cur.next
cur.next = pre
pre = cur
cur = nex
head = pre
return head
def reorder(head):
if head is none or head.next is none:
return head
cur1 = head
mid = find_mid_node(head)
cur2 = reverse(mid)
# 兩個鍊錶長度相等或者差1個,只需用cur1.next作為迴圈條件,遍歷
while cur1.next is not none:
#對鍊錶1的節點2次指標操作
tmp = cur1.next
cur1.next = cur2
cur1 = tmp
#對鍊錶2的節點2次指標操作
tmp = cur2.next
cur2.next = cur1
cur2 = tmp
# cur1.next為空,跳出迴圈,指向最後乙個cur2節點
cur1.next = cur2
return cur1
# 測試
if __name__ == "__main__":
link = linkedlist()
print("********** before **********==")
link.add(1)
link.add(2)
link.add(3)
link.add(4)
link.add(5)
link.add(6)
link.print_link()
print("********** after **********==")
reorder(link.head)
link.print_link()
#結果
********** before **********==12
3456
********** after **********==16
2534
鍊錶 重新排序
給定乙個鍊錶,形式如l0 l1 l2 l3 ln 1 ln,要求重新排序成如下形式 l0 ln l1 ln 1 如給定鍊錶為1 2 3 4 5 6,則重新排序後的結果為1 6 2 5 3 4。這裡需注意的是,要求的並不是返回乙個新鍊錶,而是直接把原鍊錶重新排序,不需返回任何值。思路 此題過程稍微有點...
鍊錶 排序鍊錶
樂扣原題 definition for singly linked list.public class listnode class solution 將鍊錶轉化為陣列 listlist new arraylist while null head 陣列遞增排序 collections.sort li...
python 排序鍊錶
題目描述 在 o n log n 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 示例 2 輸入 1 5 3 4 0 輸出 1 0 3 4 5class listnode object 定義建立鍊錶節點的類 def init self,val,n...