合并两个有序链表 题解

题目描述:21. 合并两个有序链表 - 力扣(LeetCode)

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

 题解思路:

  1. 创建一个新的链表,并将头节点设置为 newHead,用两个指针current1、current2分别指向链表的头节点;(这里便于尾插,可以用一个尾指针指向新链表末尾和创建一个带哨兵位头结点的链表,返回值为newHead->next)
  2. 比较current1、current2指向节点数值大小:如果current1的数值大于current2,则将current2作为新节点尾插在newHead后面,current2向后移动;如果current1的数值小于或等于current2,则将current1作为新节点尾插在newHead后面,current1向后移动;
  3. 重复步骤二,直到current1、current2有一个指向NULL;如果current1指向NULL(current2没有指向NULL),就把current2剩余节点全部尾插到新链表后面;如果current2指向NULL(current1没有指向NULL),就把current1剩余节点全部尾插到新链表后面;
  4. 返回新链表的头节点newHead。

代码:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    struct ListNode* newHead = (struct ListNode*)malloc(sizeof(struct ListNode));
    newHead->next = NULL;
    struct ListNode* tail = newHead;
    struct ListNode* current1 = list1, *current2 = list2;
    while(current1 && current2)
    {
        // 比较
        if(current1->val > current2->val)
        {
            // 尾插
            struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
            newNode->val = current2->val;
            newNode->next = NULL;
            tail->next = newNode;
            tail = newNode;
            current2 = current2->next;
        }
        else
        {
            struct ListNode* newNode = (struct ListNode*)malloc(sizeof(struct ListNode));
            newNode->val = current1->val;
            newNode->next = NULL;
            tail->next = newNode;
            tail = newNode;
            current1 = current1->next;
        }

    }
    if(current1) //current1 有剩余节点
    {
        tail->next = current1;
    }
    if(current2) //current2 有剩余节点
    {
        tail->next = current2;
    }
    return newHead->next;
}

注:这里尾插的的时候可以不进行创建新的节点,可以直接用原链表的节点进行连接即可。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
{
    if (list1 == NULL)
        return list2;
    if (list2 == NULL)
        return list1;
    struct ListNode* head = NULL,  * tail = NULL;
    head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
    while (list1 && list2)
    {
        if (list1->val > list2->val)
        {

            tail->next = list2;
            tail = tail->next;
            list2 = list2->next;

        }
        else
        {

            tail->next = list1;
            tail = tail->next;
            list1 = list1->next;
        }
    }
    if(list1 != NULL)
    {
        tail->next = list1;        
    }
    if(list2 != NULL)
    {
        tail->next = list2;
    }
    return head->next;
}

 显然这种方法更好,但其思路是一模一样的。


本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值