融合链表
1 package com.algorithm; 2 3 public class MergeList { 4 public ListNode Merge(ListNode list1,ListNode list2) { 5 //运行时间:32ms 6 //占用内存:688k 7 //输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 8 //第一次比较 9 if(list1 == null) 10 return list2; 11 if(list2 == null) 12 return list1; 13 ListNode listGuard = null;//哨兵,存储链表头指针 14 ListNode listroot = null; 15 //然后每次比较两条链表的每一个结点的大小,如果小的,那么将哨兵的next指向它,再 16 //将小的节点指向next 17 if(list1.val <= list2.val) { 18 listroot = list1; 19 listGuard = list1; 20 list1 = list1.next; 21 }else{ 22 listroot = list2; 23 listGuard = list2; 24 list2 = list2.next; 25 } 26 while(list1 != null && list2 != null){ 27 if(list1.val <= list2.val){//如果第一条链表小于第二条链表 28 listGuard.next = list1; 29 listGuard = list1; 30 list1 = list1.next; 31 }else{ 32 listGuard.next = list2; 33 listGuard = list2; 34 list2 = list2.next; 35 } 36 } 37 //循环遍历完了,如果第一个不等于空,则说明后面还有数据,直接移动指针listGuard即可 38 if(list1 != null) { 39 listGuard.next = list1;42 } 43 if(list2 != null) { 44 listGuard.next = list2;47 } 48 return listroot; 49 } 50 public static void main(String[] args) { 51 ListNode la = new ListNode(1); 52 ListNode lb = new ListNode(3); 53 ListNode lc = new ListNode(9); 54 la.next = lb; 55 lb.next = lc; 56 lc.next = null; 57 ListNode ma = new ListNode(4); 58 ListNode mb = new ListNode(6); 59 ListNode mc = new ListNode(7); 60 ma.next = mb; 61 mb.next = mc; 62 mc.next = null; 63 ListNode root = new MergeList().Merge(la,ma); 64 while(root!=null){ 65 System.out.print(root.val + " "); 66 root = root.next; 67 } 68 } 69 }
70 public class ListNode { 71 int val; 72 ListNode next = null; 73 74 ListNode(int val) { 75 this.val = val; 76 } 77 }
1 //递归 2 if(list1 == null) 3 return list2; 4 if(list2 == null) 5 return list1; 6 if(list1.val <= list2.val){ 7 list1.next = Merge(list1.next, list2); 8 return list1; 9 }else{ 10 list2.next = Merge(list1, list2.next); 11 return list2; 12 }