这道题常规解法有两种,可能还有其它。
解法1,设置指针 i, j 分别指向两个链表,比较 i, j 大小,小的先挂到新链表上,然后移动指针继续比较,直到某个链表走到最后,这时候把另一个链表剩余的全挂过去。
解法2, 使用递归方法,这个我一开始也没想到,方法也很简单,把合并两个链表为一个的过程看成是在两个链表中每次找出一个
最小值的过程。然后把这个最小值挂到prevNode->next指针上。
代码分别如下:
节点定义:
typedef struct node{
int data;
struct node *next;
}*pNode, Node;
解法1:
pNode listMerge(pNode pHeadA, pNode pHeadB)
{
pNode i,j;
pNode head = NULL, body = NULL;
if (!pHeadA)
return pHeadB;
if (!pHeadB)
return pHeadA;
i = pHeadA;
j = pHeadB;
while(i && j)
{
//比较大小
if (i->data < j->data)
{
if (!head)
body = head = i;
else
{
body->next = i;
body = i;
}
i = i->next;
}
else
{
if (!head)
body = head = j;
else
{
body->next = j;
body = j;
}
j = j->next;
}
}
if (i)
body->next = i;
else
body->next = j;
return head;
}
解法2:
pNode recursiveMerge(pNode pHeadA, pNode pHeadB)
{
pNode head;
if (!pHeadA)
return pHeadB;
if (!pHeadB)
return pHeadA;
if (pHeadA->data < pHeadB->data)
{
head = pHeadA;
head->next = recursiveMerge (pHeadA->next, pHeadB);
}
else
{
head = pHeadB;
head->next = recursiveMerge (pHeadA, pHeadB->next);
}
}
=============================================================================================
Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。