题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
解法1 歪门邪道
/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ import java.util.List; import java.util.ArrayList; import java.util.Collections; public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { List<Integer> list = new ArrayList<>(); while (list1!=null){ list.add(list1.val); list1=list1.next; } while (list2!=null){ list.add(list2.val); list2=list2.next; } //排序 1 < 2 < 3 < 4 递增的顺序 Collections.sort(list); ListNode head=null,//头 tail=null,//尾 newnode=null;//每次创建的新节点 for (int i = 0; i < list.size(); i++) { //创建新的节点 newnode=new ListNode(list.get(i)); //如果是第一个节点,就选创建出来头节点 if(i==0){ head =tail= newnode; }else{ //如果不是最后一个节点就往next添加节点 tail.next = newnode; tail=newnode; } } return head; } }
解法2 非递归
/* 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; ListNode end = null; //只有两个都不为空的时候,才同时进行比较 while(list1!=null && list2!=null){ //比较,找到节点小的一个 ListNode p = list1.val < list2.val ? list1 : list2; //如果这个小的节点是list1,那么list1就往后走一个 if( list1 == p){ list1 = list1.next; }else{ //否则list2就往后走 list2 = list2.next; } //判断是否是第一次,如果是第一次合并的话,就不能往.next处放,直接赋值就可 if(head == null){ head = p; end = p; }else{ end.next=p; end=p; } } /* 合并之后,可能会存在这么三种情况: 1、list1为空,但是list2不为空; 2、list1不为空,但是list2为空; 3、list1和list2都为空。 需要针对这三种情况做处理 */ if(list1 == null){ end.next = list2; } if(list2==null){ end.next = list1; } return head; } }
解法3 递归法
/* 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 newNode = null; if(list1.val < list2.val){ newNode = list1; list1 = list1.next; }else{ newNode = list2; list2 = list2.next; } //合并剩下的节点 newNode.next = Merge(list1,list2); return newNode; } }