合并两个排序的链表
来源:牛客网 http://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。返回合并链表的头节点即可。
1 class ListNode { 2 int val; 3 ListNode next = null; 4 5 ListNode(int val) { 6 this.val = val; 7 } 8 } 9 public class TT { 10 11 public static void main(String[] args) { 12 ListNode node1=new ListNode(1); 13 ListNode node2=new ListNode(2); 14 ListNode node3=new ListNode(3); 15 ListNode node4=new ListNode(4); 16 ListNode node5=new ListNode(5); 17 ListNode node6=new ListNode(6); 18 19 node1.next=node3; 20 node3.next=node5; 21 node2.next=node4; 22 node4.next=node6; 23 24 ListNode k = Merge(node1,node2); 25 while(k!=null){ 26 System.out.print(k.val+" "); 27 k=k.next; 28 } 29 30 31 } 32 33 public static ListNode Merge(ListNode list1,ListNode list2) { 34 if(list1==null) return list2; 35 else if(list2==null) return list1; 36 37 ListNode p = new ListNode(0); 38 ListNode head=p; // 39 while(true){ 40 if(list1.val<=list2.val){ 41 p.next=list1; 42 list1=list1.next; 43 p=p.next; 44 }else{ 45 p.next=list2; 46 list2=list2.next; 47 p=p.next; 48 } 49 50 if(list1==null){ 51 while(list2!=null){ 52 p.next=list2; 53 p=p.next; 54 list2=list2.next; 55 } 56 break; 57 } 58 59 if(list2==null){ 60 while(list1!=null){ 61 p.next=list1; 62 p=p.next; 63 list1=list1.next; 64 } 65 break; 66 } 67 } 68 69 return head.next; 70 71 } 72 }
另一种递归写法:
1 public ListNode Merge(ListNode list1, ListNode list2) { 2 if (list1 == null) 3 return list2; 4 else if (list2 == null) 5 return list1; 6 ListNode mergeHead = null; 7 if (list1.val < list2.val) { 8 mergeHead = list1; 9 mergeHead.next = Merge(list1.next, list2); 10 } else { 11 mergeHead = list2; 12 mergeHead.next = Merge(list1, list2.next); 13 } 14 return mergeHead; 15 16 }