package com.interview.linklist; /* * http://www.geeksforgeeks.org/maximum-sum-linked-list-two-sorted-linked-lists-common-nodes/ * Test cases * Test that chains never meet * Test that chain meets only once * Test that chain meets multipe times * Test that one chain ends where it meets chain 2 */ public class MergeForLargestSum { Node maxChain(Node head1, Node head2){ if(head1 == null){ return head2; } if(head2 == null){ return head1; } Node curr1 = head1; Node curr2 = head2; int sum1 = 0; int sum2 = 0; Node result = null; Node prev = null; while(curr1!= null && curr2 != null){ if(curr1.data == curr2.data){ sum1 += curr1.data; sum2 += curr2.data; if(sum1 <= sum2){ if(result == null){ result = head2; prev = curr2; }else{ prev.next = head2.next; prev = curr2; } }else{ if(result == null){ result = head1; prev = curr1; }else{ prev.next = head1.next; prev = curr1; } } head1 = curr1; head2 = curr2; sum1 = 0; sum2 = 0; curr1 = curr1.next; curr2 = curr2.next; } else if(curr1.data < curr2.data){ sum1 += curr1.data; curr1 = curr1.next; } else{ sum2 += curr2.data; curr2 = curr2.next; } } while(curr1 != null){ sum1+= curr1.data; curr1 = curr1.next; } while(curr2 != null){ sum2 += curr2.data; curr2 = curr2.next; } if(result != null){ if(sum1 <= sum2){ prev.next = head2.next; }else{ prev.next = head1.next; } }else{ if(sum1 <= sum2){ result = head2; }else{ result = head1; } } return result; } public static void main(String args[]){ LinkList ll = new LinkList(); Node head1 = null; head1 = ll.addNode(1, head1); head1 = ll.addNode(3, head1); head1 = ll.addNode(30, head1); head1 = ll.addNode(90, head1); head1 = ll.addNode(120, head1); head1 = ll.addNode(240, head1); head1 = ll.addNode(243, head1); head1 = ll.addNode(251, head1); head1 = ll.addNode(511, head1); Node head2 = null; head2 = ll.addNode(0, head2); head2 = ll.addNode(3, head2); head2 = ll.addNode(12, head2); head2 = ll.addNode(32, head2); head2 = ll.addNode(90, head2); head2 = ll.addNode(125, head2); head2 = ll.addNode(240, head2); head2 = ll.addNode(249, head2); head2 = ll.addNode(251, head2); head2 = ll.addNode(260, head2); MergeForLargestSum mls = new MergeForLargestSum(); Node result = mls.maxChain(head1, head2); ll.printList(result); } }