题目描述
描述
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有结点组成的。
示例1
输入:1 -> 2 -> 4, 1 -> 3 - > 4 - > 5
输出:1 -> 1 -> 2 -> 3 -> 4 -> 4 -> 5
解题分析:
思路1:将第二个链表拼接到第一个链表上,再对链表排序。
链表如何排序?详见这一篇文章“【双向链表练习】 - 对链表进行插入排序”。
代码实现1:
struct ListNode* mergeTwoLists(struct ListNode* L1, struct ListNode* L2)
{
//链表传参时,判断是否为NULL,否则解引用NULL,程序会崩
if (L1 == NULL)
return L2;//L1为空,L2不一定为空,为空或不为空也是返回L2
if (L2 == NULL)
return L1;//L2为空,L1不一定为空,为空或不为空也是返回L1
//将L2链接到L1上
struct ListNode* cur = L2;
//找L2尾节点,链上L1
while(cur->next)
{
cur = cur->next;
}
cur->next = L1;
//链表排序 - 链表的插入排序
//...
//详见【双向链表练习】 - 对链表进行插入排序
}
思路2:取L1上的结点,在L2上合适的位置插入。
代码实现2:
struct ListNode* mergeTwoLists(struct ListNode* L1, struct ListNode* L2)
{
if (L1 == NULL)
return L2;//L1为空,L2不一定为空,为空或不为空也是返回L2
if (L2 == NULL)
return L1;//L2为空,L1不一定为空,为空或不为空也是返回L1
//1 -> 2 -> 4, 1 -> 3 - > 4 - > 5
//2 -> 4, 1 ->1 -> 3 - > 4 - > 5
//4, 1 ->1 -> 2 -> 3 - > 4 - > 5
struct ListNode* nextL1 = NULL;
struct ListNode* curL1 = L1;
while (curL1)
{
struct