#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
typedef struct node_t {
int x;
struct node_t *next;
} *Node;
static int advance(Node *nd)
{
int res = (*nd)->x;
*nd=(*nd)->next;
return res;
}
int getMin(Node *list1, Node *list2)
{
if (*list1 == NULL) return advance(list2);
if (*list2 == NULL) return advance(list1);
if ((*list1)->x < (*list2)->x) return advance(list1);
return advance(list2);
}
int main(void)
{
struct node_t a3 = {13, NULL};
struct node_t a2 = {12, &a3};
struct node_t a1 = {4, &a2};
struct node_t a0 = {1, &a1};
Node a = &a0;
struct node_t b3 = {7, NULL};
struct node_t b2 = {5, &b3};
struct node_t b1 = {3, &b2};
struct node_t b0 = {2, &b1};
Node b = &b0;
while (a || b) {
printf("%d\n", getMin
(&a
, &b
)); }
return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCnR5cGVkZWYgc3RydWN0IG5vZGVfdCB7CiAgICBpbnQgeDsKICAgIHN0cnVjdCBub2RlX3QgKm5leHQ7Cn0gKk5vZGU7CgpzdGF0aWMgaW50IGFkdmFuY2UoTm9kZSAqbmQpCnsKICAgIGludCByZXMgPSAoKm5kKS0+eDsKCiAgICAqbmQ9KCpuZCktPm5leHQ7CgogICAgcmV0dXJuIHJlczsKfQoKaW50IGdldE1pbihOb2RlICpsaXN0MSwgTm9kZSAqbGlzdDIpCnsKICAgIGFzc2VydCgqbGlzdDEgfHwgKmxpc3QyKTsKCiAgICBpZiAoKmxpc3QxID09IE5VTEwpIHJldHVybiBhZHZhbmNlKGxpc3QyKTsKICAgIGlmICgqbGlzdDIgPT0gTlVMTCkgcmV0dXJuIGFkdmFuY2UobGlzdDEpOwogICAgaWYgKCgqbGlzdDEpLT54IDwgKCpsaXN0MiktPngpIHJldHVybiBhZHZhbmNlKGxpc3QxKTsKICAgIAogICAgcmV0dXJuIGFkdmFuY2UobGlzdDIpOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgICBzdHJ1Y3Qgbm9kZV90IGEzID0gezEzLCBOVUxMfTsKICAgIHN0cnVjdCBub2RlX3QgYTIgPSB7MTIsICZhM307CiAgICBzdHJ1Y3Qgbm9kZV90IGExID0gezQsICZhMn07CiAgICBzdHJ1Y3Qgbm9kZV90IGEwID0gezEsICZhMX07CiAgICBOb2RlIGEgPSAmYTA7CiAgICAKICAgIHN0cnVjdCBub2RlX3QgYjMgPSB7NywgTlVMTH07CiAgICBzdHJ1Y3Qgbm9kZV90IGIyID0gezUsICZiM307CiAgICBzdHJ1Y3Qgbm9kZV90IGIxID0gezMsICZiMn07CiAgICBzdHJ1Y3Qgbm9kZV90IGIwID0gezIsICZiMX07CiAgICBOb2RlIGIgPSAmYjA7CiAgICAKICAgIHdoaWxlIChhIHx8IGIpIHsKICAgICAgICBwcmludGYoIiVkXG4iLCBnZXRNaW4oJmEsICZiKSk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9Cg==