Merge two sorted linkedlist

题目:合并两个排序的链表

要求:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

方法一:用递归的形式来实现

 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 }
View Code

错误原因: 整个中间部分都没有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)

猜你喜欢

转载自www.cnblogs.com/shareidea94/p/10858586.html