// 2181. Merge Nodes in Between Zeros
#include "leetcode.h"

/*
 * given the 'head' of a linked list which contains a series of integers
 * separated by 0's. the beginning and end of the linked list will have
 * 'node.val == 0'. for every consecutive 0's, merge all the nodes lying in
 * between them into a single node whose value is the sum of all the merged
 * nodes. the modified list should not contain any 0's. return the 'head' of the
 * modified linked list.
 */

struct ListNode {
  int val;
  struct ListNode *next;
};

struct ListNode *mergeNodes(struct ListNode *head) {
  head = head->next;
  struct ListNode *trav = head;
  while (trav)
    if (trav->next && trav->next->val) {
      trav->val = trav->val + trav->next->val;
      trav->next = trav->next->next;
    } else {
      trav->next = trav->next->next;
      trav = trav->next;
    }
  return head;
}

struct ListNode *create_node(int val) {
  struct ListNode *new = (struct ListNode *)malloc(sizeof(struct ListNode));
  new->val = val;
  new->next = NULL;
  return new;
}

void print_node(struct ListNode *head) {
  struct ListNode *curr = head;
  while (curr != NULL) {
    printf("%d ", curr->val);
    curr = curr->next;
  }
  printf("\n");
}

int main() {
  struct ListNode *head = create_node(0);
  head->next = create_node(3);
  head->next->next = create_node(1);
  head->next->next->next = create_node(0);
  head->next->next->next->next = create_node(4);
  head->next->next->next->next->next = create_node(5);
  head->next->next->next->next->next->next = create_node(2);
  head->next->next->next->next->next->next->next = create_node(0);
  struct ListNode *merged_head = mergeNodes(head);
  print_node(merged_head); // expect: 4 11
}