题目:合并两个排序的链表
要求:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
方法一:用递归的形式来实现
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode list1,ListNode list2) { 12 ListNode result = null; 13 if(list1 == null) return list2; 14 if(list2 == null) return list1; 15 if((list1 == null) && (list1 == null)) return null; 16 if(list1.val <= list2.val){ 17 result = list1; 18 result.next = Merge(list1.next,list2); 19 }else{ 20 result = list2; 21 result.next = Merge(list1,list2.next); 22 } 23 return result; 24 } 25 }
思考1:一开始认为不同的result 值会冲突,但是每次递归开始,都会重新set另外一个result为null,并不会存在这样的问题
方法二:非递归的形式
一开始的错误代码
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode list1,ListNode list2) { 12 ListNode result = null; 13 if(list1 == null) return list2; 14 if(list2 == null) return list1; 15 if((list1 == null) && (list1 == null)) return null; 16 while((list1.next != null)&& (list1.next != null)){ 17 if(list1.val <= list2.val){ 18 result = list1; 19 list1 = list1.next; 20 }else{ 21 result = list2; 22 list2 = list2.next; 23 } 24 } 25 if(list1.next == null) result.next = list2; 26 if(list2.next == null) result.next = list1; 27 return result; 28 } 29 }
错误原因: 整个中间部分都没有result.next操作啊,怎么能一点点往后加新的结点呢
就算有了resule.next,但是result的位置一直在往后走,最终也无法返回链表的头结点. 所以必须要有两个变量
正确的代码如下:
1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 }*/ 10 public class Solution { 11 public ListNode Merge(ListNode list1,ListNode list2) { 12 //result必须赋值,赋为-1即可,赋为null,会报java.lang.NullPointerException错误 13 ListNode result = new ListNode(-1); 14 ListNode head = result; 15 //最终返回head.next即可 16 if(list1 == null) return list2; 17 if(list2 == null) return list1; 18 if((list1 == null) && (list1 == null)) return null; 19 //判断当前结点是否是null,错误:(list1.next != null)&& (list2.next != null) 20 while((list1 != null)&& (list2 != null)){ 21 if(list1.val <= list2.val){ 22 result.next = list1; 23 result= result.next; 24 list1 = list1.next; 25 }else{ 26 result.next = list2; 27 result= result.next; 28 list2 = list2.next; 29 } 30 } 31 //错误:list1.next==null 32 if(list1 == null) result.next = list2; 33 if(list2 == null) result.next = list1; 34 return head.next; 35 } 36 }
总结:无论是哪种形式,都一定要考虑特殊情况
if(list1 == null) return list2;
if(list2 == null) return list1;
if((list1 == null) && (list1 == null)) return null;
方法三:在IDEA上通过的代码(TODOLIST)