题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
我在这个题中学到了两点。1:在Java中的=赋值对于对象来说,其实是把这个地址赋值给它。可以操作其它的实例的引用来去改变这个地址中的内容。就体现在第一种方法当中,我创建了两个节点,一个节点去创造链表,一个节点去用来保存当前的状态。2:对于每次操作没有关联都是一种重新开始的时候,可以考虑一下递归思想。这个题的简单的解法就是递归的思想。递归的时候一定要考虑好终止的条件。
我的思路
创建两个节点,一个用来去存储当前节点的第一个值,一个去作出一个链表。
我用这个方法遇到的难题是:怎么才能保存住当前节点的值,第一次尝试的时候都是在没有办法解决保存节点的问题,后来创建了两个节点。
public static ListNode Merge(ListNode list1,ListNode list2){
ListNode result = new ListNode(-1);
ListNode temp1 = result;
while(list1 != null && list2 != null){
int temp = list1.val;
if(temp < list2.val){
result.next= new ListNode(list1.val);
list1 = list1.next;
result = result.next;
}else if(temp == list2.val){
result.next = new ListNode(list1.val);
result.next.next = new ListNode(list2.val);
list1 = list1.next;
list2 = list2.next;
result = result.next.next;
}else{
result.next = new ListNode(list2.val);
list2 = list2.next;
result = result.next;
}
}
while(list1 != null){
result.next = list1;
list1 = list1.next;
result = result.next;
}
while(list2 != null){
result.next = list2;
list2 = list2.next;
result =result.next;
}
result.next = null;
return temp1.next;
}
书中优化的解法
即每次操作都相当于一个新的内容的时候,便可以考虑这个递归的思想。
public static ListNode simpleMerge(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 = simpleMerge(list1.next,list2);
}else{
head = list2;
head.next = simpleMerge(list1,list2.next);
}
return head;
}