題目:輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則
分析:先找兩個鏈表中第一個元素較小的結點做新鏈表的頭,然後依次比較兩個鏈表的元素,將小的尾插在新鏈表中(爲了尾插方便,這裏使用了尾指針標記新鏈表的尾),只要有一個結束了,就將另一個(即還有剩餘元素的鏈表)之間掛在新鏈表的尾上。
ListNode* Merge(ListNode* pHead1, ListNode* pHead2)
{
//如果其中一個是空,那麼就返回另外一個
if(pHead1==nullptr)
return pHead2;
else if(pHead2==nullptr)
return pHead1;
ListNode* head;//新鏈表的頭
ListNode* tail;//新鏈表的尾
//看那個鏈表的第一個元素小,讓其做新鏈表的頭
if(pHead1->val<pHead2->val)
{
head=pHead1;
pHead1=pHead1->next;
}
else
{
head=pHead2;
pHead2=pHead2->next;
}
tail=head;//並且剛開始讓tail也指向第一個節點
//只要有一個結束就結束(挨着比較,將兩個鏈表中較小的元素尾插在新鏈表中)
while(pHead2 && pHead1)
{
if(pHead1->val<pHead2->val)
{
tail->next=pHead1;
pHead1=pHead1->next;
}
else
{
tail->next=pHead2;
pHead2=pHead2->next;
}
//無論是哪個鏈表小,尾插後移動新鏈表的tail指針
tail=tail->next;
}
//來到這,可能是某一個鏈表走完了,則將不完的那個鏈表直接鏈在新鏈表tail的後面
if(pHead1!=nullptr)
{
tail->next=pHead1;
}
if(pHead2!=nullptr)
{
tail->next=pHead2;
}
return head;//最後返回新鏈表的頭
}