I was reading the answer to Merging two sorted linked list. The code:
#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0)
Node* MergeLi
pnext is a pointer to a pointer of Node and is meant to hold the address of the next
field of the last node
so the first line sets the pointer to the next node (either list or the previous node->next
)
the second line sets pnext to the next
field of the current node
the third line advances list1 after just dealing with the head of it using the just assigned pnext for a micro-optimization that avoids dereferencing list1 again
you can also write it in terms of node->next:
#define SWAP_PTRS(a, b) do { void *t = (a); (a) = (b); (b) = t; } while (0)
Node* MergeLists(Node* list1, Node* list2)
{
Node *list = NULL, *node ;
if (list2 == NULL)
return list1;
if (list1->data > list2->data)
SWAP_PTRS(list1, list2);
node=list=list1;
list1=list1->next;
while (list1 != NULL)
{
if (list1->data > list2->data)
SWAP_PTRS(list1, list2);
node->next = list1;
node = list1->next;
list1 = list1->next;
}
node->next = list2;
return list;
}