i trying out merging of 2 sorted linked list.
the code snippet doesn't work below 2 list :
list 1 : 1->3->5->7->9->null list 2 : 2->4->6->8->10->null expected list : 1->2->3->4->5->6->7->8->9->10->null but output below programs turns out :
output : 1->2->3->4->5->6->7->8->9->null // element 10 missing. am missing ? live demo : http://ideone.com/o7mblo
class node { node next; int value; node(int val) { this.value = val; this.next = null; } @override public string tostring() { node cur = this; string str = ""; while(cur != null) { str += cur.value+"->"; cur = cur.next; } return str; } } class mergell { public static node merge(node n1, node n2) { node result = null; if(n1 != null && n2 != null) { if(n1.value < n2.value) { result = n1; result.next = merge(n1.next, n2); } else { result = n2; result.next = merge(n1, n2.next); } } return result; } public static void main(string[] args) { node n1 = new node(1); node n3 = new node(3); node n5 = new node(5); node n7 = new node(7); node n9 = new node(9); n1.next = n3; n3.next = n5; n5.next = n7; n7.next = n9; n9.next = null; node n2 = new node(2); node n4 = new node(4); node n6 = new node(6); node n8 = new node(8); node n10 = new node(10); n2.next = n4; n4.next = n6; n6.next = n8; n8.next = n10; n10.next = null; system.out.println("merge : " + merge(n1, n2)); } }
you need add 2 more conditions, when either n1 or n2 exhausts earlier. so, condition - n1 != null && n2 != null, work in case when both list of same size.
just add code below 2 conditions, after if:
if(n1 != null && n2 != null) { if(n1.value < n2.value) { result = n1; result.next = merge(n1.next, n2); } else { result = n2; result.next = merge(n1, n2.next); } } else if (n1 != null) { result = n1; // add elements of `n1` `result` } else if (n2 != null) { result = n2; // add elements of `n2` `result` } actually, you don't need build new result list there. can extend 1 of passed nodes.
you can modify method below:
public static node merge(node n1, node n2) { if (n1 == null) return n2; if (n2 == null) return n1; if (n1.value < n2.value) { n1.next = merge(n1.next, n2); return n1; } else { n2.next = merge(n2.next, n1); return n2; } }
Comments
Post a Comment