劍指offer每日一題算法題(java解法)
方便日後複習,從今天開始。
算法之行始於足下
[編程題]鏈合併兩個排序的鏈表-- Java實現
----------------------------------------------------------------------------------------------------
題目描述
輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
非遞歸
解題思路:
1.就是創建一個頭指針root,和一個位移指針head,root=head.
2.判斷兩個鏈表指針的值大小,誰小就把誰的值放入head的next中,
然後,放進去了,自然指針要後移了,繼續比較下一個,於是head=list,
list=list.next,list位移到下一個元素,反之,如果list2小,也是一樣把它給head.next,再位移到下一位,直到小的一方數組爲空,則把大的一方數組直接接在head.next後面
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
ListNode head=new ListNode(-1);
head.next=null;
ListNode root=head;
while(list1!=null && list2!=null){
if(list1.val<list2.val){
head.next=list1;
head=list1;
list1=list1.next;
}else{
head.next=list2;
head=list2;
list2=list2.next;
}
}
if(list1!=null)
head.next=list1;
if(list2!=null)
head.next=list2;
return root.next;
}
}
遞歸
解題思路:
1.先判斷兩個鏈表不能爲空
2.與非遞歸一樣思路,比較子節點的值,誰小誰就放進head指針裏面(這裏head沒有next就直接讓head=list就可以)然後就把小的值放進head裏面了,至於位移的話,這裏跟非遞歸的區別在於,它採用把list.next下一個值傳進函數,再次比較,而不是位移,這樣就能循環比較,而且把值放入了head.next裏面
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if(list1==null){
return list2;
}
if(list2==null){
return list1;
}
ListNode head=null;
if(list1.val<list2.val){
head=list1;
head.next=Merge(list1.next,list2);
}else{
head=list2;
head.next=Merge(list1,list2.next);
}
return head;
}
}