对于链表,《剑指offer》中感觉有些地方不妥,前面讲过链表的头指针是指向一个指针的指针,即指向头结点的指针的指针。但是后面在链表的使用中输入的头指针只是指向链表的头结点的指针。
后面看《c和指针》时看到单链表这一块,链表的表示时用一个根指针来表示链表的起始位置,根指针指向链表的第一个节点,根指针只是一个指针,不包含任何数据。当我们需要改动链表,如果可能改动根指针,如将根指针改为指向另一个节点,则传参时需要以指针形式传递才可以改动根指针的值,即参数就变为了指向根指针的指针,也是指向第一个节点的指针的指针。而当我们不会改动链表根指针时输入参数不需要输入指针,直接输入根指针就可以了。
题目:合并两个排序的数组
递归的方法:(附上《剑指offer》中的解法)
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
};
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
return pHead2;
else if(pHead2 == NULL)
return pHead1;
ListNode* pMergedHead = NULL;
if(pHead1->m_nValue < pHead2->m_nValue)
{
pMergedHead = pHead1;
pMergedHead->m_pNext = Merge(pHead1->m_pNext, pHead2);
}
else
{
pMergedHead = pHead2;
pMergedHead->m_pNext = Merge(pHead1, pHead2->m_pNext);
}
return pMergedHead;
}
循环的方法:(在这里我写了一个循环的方法,这里还是输入参数为指向头结点的指针,因为原列表的头指针可以不变,但此时实际上链表1和链表2已经不是原来的链表了;个人感觉应该将两个根指针置为NULL比较好)
ListNode* MergeSorted2Lists(ListNode* pHead1, ListNode* pHead2)
{
if(pHead1 == NULL)
return pHead2;
else if(pHead2 == NULL)
return pHead1;
ListNode* pListNewSmall = pHead1;
ListNode* pListNewLarge = pHead2;
if(pListNewSmall->m_nValue > pListNewLarge->m_nValue)
{
swap(pListNewLarge,pListNewSmall);
}
ListNode* pMergedHead = pListNewSmall;
while(pListNewLarge)
{
while( pListNewSmall->m_pNext && pListNewSmall->m_pNext->m_nValue <= pListNewLarge->m_nValue )
{
pListNewSmall = pListNewSmall->m_pNext;
}
ListNode* tempNode = pListNewSmall->m_pNext;
pListNewSmall->m_pNext = pListNewLarge;
pListNewSmall = pListNewLarge;
pListNewLarge = tempNode;
}
return pMergedHead;
}