#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dllist.h"

void setUnion(Dllist *L1, Dllist *L2) {
  Dllist_Node *p1, *p2, *saveNode;
  int val1, val2;

  p1 = dll_first(L1);
  p2 = dll_first(L2);
  while ((p1 != dll_sentinel(L1)) && (p2 != dll_sentinel(L2))) {
    val1 = *(int *)dll_val(p1);
    val2 = *(int *)dll_val(p2);
    
    if (val1 == val2) {
      p1 = dll_next(p1);
      p2 = dll_next(p2);
    }
    else if (val1 < val2) {
      p1 = dll_next(p1);
    }
    else { 
      // val1 > val2 so add val2 to L1
      dll_insert_before(p1, dll_val(p2));
      p2 = dll_next(p2);
    } 
  }
  // add remainder of L2 to L1 if necessary
  for ( ; p2 != dll_sentinel(L2); p2 = dll_next(p2)) {
    dll_append(L1, dll_val(p2));
  }
}

main(int argc, char *argv[]) {
  Dllist *list1 = new_dllist();
  Dllist *list2 = new_dllist();
  int i = 1;
  int *val;
  Dllist_Node *ptr;
  while (strcmp(argv[i], "$") != 0) {
    val = (int *)malloc(sizeof(int));
    sscanf(argv[i], "%i", val);
    dll_append(list1, val);
    i++;
  }
  for (i++; i < argc; i++) {
    val = (int *)malloc(sizeof(int));
    sscanf(argv[i], "%i", val);
    dll_append(list2, val);
  }
  setUnion(list1, list2);
  for (ptr = dll_first(list1);
       ptr != dll_sentinel(list1);
       ptr = dll_next(ptr)) {
    printf("%i\n", *(int *)dll_val(ptr));
  }
}

