原题链接:
合并两个排序的链表_牛客题霸_牛客网
思路分析:
第一步:写一个链表尾插数据的方法。
typedef struct ListNode ListNode;
//申请结点
ListNode* BuyNode(int x)
{
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = x;
node->next = NULL;
return node;
}
//尾插
void ListPushBack(ListNode** pphead, int x)
{
ListNode* NewNode = BuyNode(x);
if(*pphead == NULL)
{
*pphead = NewNode;
}
else
{
ListNode* pcur = *pphead;
while(pcur->next)
{
pcur = pcur->next;
}
pcur->next = NewNode;
}
}
第二步:创建三个链表结点。l1 用来遍历链表1,l2用来遍历链表2,RetList 是返回链表。
ListNode* RetList = NULL, *l1 = pHead1, *l2 = pHead2;
第三步:进行遍历判断。如果 l1 结点里的值小于 l2 结点里的值,就把 l1 结点里的值尾插到返回链表。反之,就把 l2 结点里是值尾插到返回链表。
while(l1 && l2)
{
if(l1->val < l2->val)
{
ListPushBack(&RetList, l1->val);
l1 = l1->next;
}
else
{
ListPushBack(&RetList, l2->val);
l2 = l2->next;
}
}
循环之前:
第一次循环之后:
第二次循环之后:
第三次循环之后:
第四次循环之后:
第五次循环之后:
如果 l1 或者 l2 遍历到 NULL 的时候,会有一方没有完全遍历完所有结点,所以我们还需要补上两个循环去遍历完 l1 或者 l2。
while(l1)
{
ListPushBack(&RetList, l1->val);
l1 = l1->next;
}
while(l2)
{
ListPushBack(&RetList, l2->val);
l2 = l2->next;
}
return RetList;
完整代码:
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 )
{
ListNode* RetList = NULL, *l1 = pHead1, *l2 = pHead2;
while(l1 && l2)
{
if(l1->val < l2->val)
{
ListPushBack(&RetList, l1->val);
l1 = l1->next;
}
else
{
ListPushBack(&RetList, l2->val);
l2 = l2->next;
}
}
while(l1)
{
ListPushBack(&RetList, l1->val);
l1 = l1->next;
}
while(l2)
{
ListPushBack(&RetList, l2->val);
l2 = l2->next;
}
return RetList;
}