力扣-合并两个有序链表和牛客-链表分割

前面我们说过合并两个有序数组,这里我们来说说合并两个有序链表。
在这里插入图片描述
难度 简单 OJ链接
在这里插入图片描述
思路:
每次取小的,尾插到新链表。
在这里插入图片描述
我们定义一个tail来记录尾节点,这样我们就不需要找尾。

结束条件:当有一个链表为空时,就结束循环。然后把另外一个链表直接连接到后面就行了。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
//如果一个链表为NULL,就返回另外的一个链表
	if (list1 == NULL)
		return list2;

	if (list2 == NULL)
		return list1;

	struct ListNode* head = NULL, * tail = NULL;
//两个链表都不为NULL
	while (list1 && list2)
	{
		if (list1->val < list2->val)
		{
			if (tail == NULL)
			{
				head = tail = list1;
			}
			else
			{
				tail->next = list1;
				tail = list1;
			}

			list1 = list1->next;//找下一个节点
		}
		else
		{
			if (tail == NULL)
			{
				head = tail = list2;
			}
			else
			{
				tail->next = list2;
				tail = list2;
			}

			list2 = list2->next;//找下一个节点
		}
	}
//结束时,如果有一个链表不为空,就直接连接后面的节点
	if (list1)
	{
		tail->next = list1;
	}

	if (list2)
	{
		tail->next = list2;
	}


	return head;
}

我们再说一种写法:我们用带哨兵位节点来做。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {

	struct ListNode* head = NULL, * tail = NULL;

    //定义一个哨兵位的节点
    head=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
    head->next=NULL;

	while (list1 && list2)
	{
		if (list1->val < list2->val)
		{
				tail->next = list1;
				tail = list1;
			    list1 = list1->next;
		}
		else
		{
                tail->next = list2;
                tail = list2;
                list2 = list2->next;
		}
	}

	if (list1)
	{
		tail->next = list1;
	}

	if (list2)
	{
		tail->next = list2;
	}

//释放空间,防止内存泄漏
    struct ListNode* list=head->next;
    free(head);
	return list;
}

定义一个哨兵位的节点,我们就不需要顾及是不是为NULL了,因为现在tail是有值的了,直接连接在后面就行了。

难度 简单 OJ链接
在这里插入图片描述
这里,我先举一个例子:
在这里插入图片描述
假设x为4,我们把小于4的放在前面,但相对位置不变。

解题思路:
遍历原链表:1.把<x的插入链表1。
2.把>=x的插入链表2。
3.连接链表1和链表2。

在这里插入图片描述
当我们连接结束后,我们把lessHead和greaterHead给free掉。

但是,到这里并没有结束,程序还有问题。
有时候,我们做题时需要考虑一些极端的情况。
在这里插入图片描述
这里第4种情况我们要考虑一下:
在这里插入图片描述
如果是这样就会有些问题:
在这里插入图片描述
它会形成带环问题,所以最后我们要处理一下,将greaterTail->next置为NULL。

代码如下:

   ListNode* partition(ListNode* pHead, int x) {
        struct ListNode *lessHead,*lessTail,*greaterHead,*greaterTail;
        lessHead=lessTail=(struct ListNode*)malloc(sizeof(struct ListNode));
        greaterHead=greaterTail=(struct ListNode*)malloc(sizeof(struct ListNode));
        
        greaterTail->next=lessTail->next=NULL;
        while(pHead)
        {
            if(pHead->val<x)
            {
                lessTail->next=pHead;
                lessTail=pHead;
            }
            else
            {
                greaterTail->next=pHead;
                greaterTail=pHead;
            }
            
            pHead=pHead->next;
        }
        
        lessTail->next=greaterHead->next;
        //最后一个节点的next置为NULL
        greaterTail->next=NULL;
        struct ListNode* list=lessHead->next;
        free(lessHead);
        free(greaterHead);
        
        greaterHead=NULL;
        lessHead=NULL;
        
        return list;
    }

在这里插入图片描述

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值