链表-合并有序链表序列
心思想:
- 判空,任意一个为空,则返回另一个
- 定义新链表头和新链表的哨兵指针
- 给2定义的链表头和哨兵赋值:需从两个非空链表抉择出来一个小者结点
- 遍历两个链表,任意一个为空了,则结束
- 判断出小的结点,追加到新链表结点的哨兵尾,且移动哨兵结点
- 被摘掉的链表往后移一步
- 粘贴新链表和结束前人一个非空的链表
- 返回
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
// 分别判断是否为空
if(pHead1 == NULL)
{
return pHead2;
}
if(pHead2 == NULL)
{
return pHead1;
}
// 排序,此刻两个不为空的链表,以pHead1为基准
struct ListNode * newHead=NULL;
struct ListNode * curr=NULL;
if(pHead1->val > pHead2->val)
{
newHead=pHead2;
curr=pHead2;
pHead2=pHead2->next;
}
else
{
newHead=pHead1;
curr=pHead1;
pHead1=pHead1->next;
}
// 遍历两个node节点,挨个节点判断纳入新节点
// 注意摘节点的步骤
while(pHead1 != NULL && pHead2 != NULL )
{
if(pHead1->val < pHead2->val)
{
// 摘取小的结点
curr->next = pHead1;
curr=pHead1;
pHead1=pHead1->next;
}
else
{
curr->next = pHead2;
curr=pHead2;
pHead2=pHead2->next;
}
}
// 剩余谁是null
if(pHead1 == NULL)
{
curr->next = pHead2;
}
else
{
curr->next = pHead1;
}
return newHead;
}