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