鍊錶的合併

2021-08-17 14:50:57 字數 2224 閱讀 3745

對於鍊錶的操作,還有幾個是比較常用的,比如:將兩個已排序的鍊錶合併成乙個長的排序鍊錶;在已排序的鍊錶中插入乙個元素;對乙個無序鍊錶根據給定的某個值,進行分割槽。現在,我們就來看看這三個問題。

問題:如何將兩個排序鍊錶合併成乙個長排序鍊錶

分析:有兩個鍊錶curr1,curr2,構建乙個新的鍊錶 dummy,遍歷 curr1 和 curr2,比較 curr1 和 curr2,誰小移動誰,用 curr 來記錄需要移動的位置。迴圈結束,curr1 和 curr2 有乙個尾指標沒有指向,需要在把尾指標指向 dummy 的結尾的,最後返回 dummy 的下乙個節點即可。

/**

* 合併鍊錶

*/public listnode merge(listnode first, listnode second) else

}if (curr1 != null) else

return dummy.next;

}

時間複雜度 o(m+n)

空間複雜度 o(1)

問題:在鍊錶中插入乙個節點

分析:遍歷鍊錶,取出每個節點與目標值 target 進行比較,小於 target,記錄節點 prev,當前節點 curr 往後移動一位。遍歷結束,把 target 插入 prev 後面,在 target 插入 curr。

public listnode insert(listnode head, int target) 

listnode prev = null;

listnode curr = head;

while (curr != null) else

}listnode newhead = new listnode(target);

prev.next = newhead;

newhead.next = curr;

return head;

}

問題:如何分割槽乙個鍊錶

描述:給定乙個鍊錶和乙個目標值x,將其劃分為所有小於x的節點放在左邊,大於x的節點放在右邊,並且保證兩個分割槽中每個節點的原始相對順序。

例子:

輸入:1 6 3 2 5 2 目標值:4

輸出:1 3 2 2 6 5

分析:構建兩個鍊錶 dummy1,dummy2,遍歷鍊錶,比較當前節點 curr 與目標值 target,小於的話放到 dummy1 中,大於的話放到 dummy2 中,最後把 dummy1 和 dummy2 相接。注意,要把 dummy2 的尾節點置空,否則,就是乙個環狀。

public static void main(string args) 

system.out.print(newhead.value + " ");

}public listnode partition(listnode head, int target) else }//

dummy1: 0-->

1-->

3-->

2-->

2-->

null

// curr1

//dummy2: 0-->

6-->

5-->

2-->

null

// curr2

//result: >1-->

3-->

2-->

2-->

6-->

5-->

null

curr1.next = dummy2.next;

//dummy1: 0-->

1-->

3-->

2-->

2-->

6-->

5-->

2-->

null

// curr2

curr2.next = null;

//dummy1: 0-->

1-->

3-->

2-->

2-->

6-->

5-->

null

return dummy1.next;

}

時間複雜度 o(n)

空間複雜度 o(1)

鍊錶的合併

兩個線性表a,b,均以單鏈表做儲存結構,編寫演算法將表a和表b合併成乙個按元素值遞增有序排列的線性表c,要求用原表的結點空間存放表c define null 0 include stdio.h include malloc.h typedef struct lnode lnode,linklist ...

鍊錶的合併

include include typedef struct lnode list struct lnode list l struct lnode lnode list create pre next null return l void print list l while p printf n...

鍊錶的合併

輸入格式 第一行 單鏈表a的元素個數 第二行 單鏈表a的各元素 非遞減 用空格分開 第三行 單鏈表b的元素個數 第四行 單鏈表b的各元素 非遞減 用空格分開 輸出格式 第一行 單鏈表a的元素列表 第二行 單鏈表b的元素列表 第三行 合併後單鏈表c的元素列表 輸入樣例 612 24 45 62 84 ...