题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
题目链接:
算法:
1、递归:找到当前两个链表中较小的节点,子问题:剩下的节点需要排序。
2、非递归
关键点:
维护合并后链表表尾位置的指针。
分析:
list1: 1->2->5->6
list2: 3->4->8
具体过程:
1、list1需要走到节点2,指向list2
2、list2走到节点4,指向list1……
3、以此类推。
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 12 public ListNode Merge(ListNode list1,ListNode list2) { 13 if(list1 == null){ 14 return list2; 15 } 16 if(list2 == null){ 17 return list1; 18 } 19 //找到当前较小节点,它的下一个节点,即是一个子问题 20 if(list1.val <= list2.val){ 21 list1.next = Merge(list1.next,list2); 22 return list1; 23 }else{ 24 list2.next = Merge(list1,list2.next); 25 return list2; 26 } 27 28 /* 29 //某个链表为null,直接返回另一个链表 30 if(list1 == null){ 31 return list2; 32 } 33 if(list2 == null){ 34 return list1; 35 } 36 //调整一下,使list1始终代表头结点 37 if(list1.val > list2.val){ 38 ListNode tmp = list1; 39 list1 = list2; 40 list2 = tmp; 41 } 42 ListNode head = list1; 43 ListNode cur = null; 44 while(list1!=null&&list2!=null){ 45 //前面已做调整,list1较小所以从list1开始 46 //遍历list1 节点,一直找到list1上比list2当前节点大的值或者遍历到list1尾部 47 while(list1!=null&&list1.val <= list2.val){ 48 cur = list1; 49 list1 = list1.next; 50 } 51 cur.next = list2; 52 //如果list1遍历完,则合并结束 53 if(list1 == null){ 54 break; 55 } 56 //遍历list2 节点,一直找到list2上比list1当前节点大的值或者遍历到list2尾部 57 while(list2!=null&&list2.val <= list1.val){ 58 cur = list2; 59 list2 = list2.next; 60 } 61 cur.next = list1; 62 //如果list2遍历完,则合并结束 63 if(list2 == null){ 64 break; 65 } 66 67 } 68 return head; 69 */ 70 } 71 72 73 }