链表算法:合并两个有序链表将小于x的数据置于链表前部分链表的回文判断

Posted 蚍蜉撼树谈何易

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表算法:合并两个有序链表将小于x的数据置于链表前部分链表的回文判断相关的知识,希望对你有一定的参考价值。

一、合并两个有序链表
方法一、通过插入思想完成
1.首先确定头结点是l1链表还是l2链表
2.根据l1与l2当前指向的数据判断应该插入到哪一位置
3.若此时已遍历到某一链表的结束位置,则将新链表的最后一个元素指向另一链表的起始位置(从判断的当前元素开始的位置),循环结束。
第一步
在这里插入图片描述

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
    struct ListNode *head = NULL,*pre = NULL;;
    while(l1 != NULL || l2 != NULL)
    {
        if(head == NULL)
        {
            if(l1 == NULL)
            {
                return l2;
            }
            else if(l2 == NULL)
            {
                return l1;
            }
            else
            {
                if(l1->val <= l2->val)
                {
                    head = l1;
                    pre = head;
                    l1 = l1->next;
                }
                else
                {
                    head = l2;
                    pre = head;
                    l2 = l2->next;
                }
            }
        }
        else
        {
            if(l1 == NULL)
            {
                pre->next = l2;
                break;
            }
            else if(l2 == NULL)
            {
                pre->next = l1;
                break;
            }
            else
            {
                if(l1->val <= l2->val)
                {
                    pre->next = l1;
                    pre = pre->next;
                    l1 = l1->next;
                }
                else
                {
                    pre->next = l2;
                    pre = pre->next;
                    l2 = l2->next;
                }
            }
        }
    }
    return head;
}

方法二、递归思想
在这里插入图片描述

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
    if(l1==NULL)
        return l2;
    if(l2==NULL)
        return l1;
    if(l1->val < l2->val)//确定合成链表的首元素,l1或l2指向位移
    {
        l1->next = mergeTwoLists(l1->next,l2);
        return l1;
    }else{
        l2->next = mergeTwoLists(l1,l2->next);
        return l2;
    }
}

详细讲解对应小破站:合并链表
二、将小于x的数据置于链表的前半部分

ListNode* partition(ListNode* pHead, int x)
{
	if (pHead == NULL)
	{
		return;
	}
	//思路:先将大于x的元素排成一列,再将小于x的链表排成一列,最后连接起来即可
	ListNode* pheader1 = NULL;//记录的是大于等于x的链表
	ListNode* pheader2 = NULL;//记录的是小于x的链表
	ListNode* ptail1 = NULL;//维护的是大于x的链表尾结点
	ListNode* ptail2 = NULL;//维护的是小于x的链表尾结点
	while (pHead)
	{
		if (pHead->val >= x)
		{
			if (pheader1 == NULL)
			{
				pheader1 = pHead;//先确定首元素
				ptail1 = pheader1;//同时更新尾结点
			}
			else
			{
				ptail1->next = pHead;
				ptail1 = pHead;
			}
		}
		else
		{
			if (pheader2 == NULL)
			{
				pheader2 = pHead;
				ptail2 = pheader2;
			}
			else
			{
				ptail2->next = pHead;//每次采取尾插的方式插入
				ptail2 = pHead;
			}
		}
		pHead = pHead->next;
	}
	if (pheader2 != NULL)
	{

		ptail2->next = pheader1;//将两个链表连接起来,同时设立终止结点(将最后一个元素的next置为空,便于访问)
		ptail1->next = NULL;
		return pheader2;
	}
	else
	{
		ptail1->next = NULL;
		return pheader1;
	}

}
};

三、链表的回文判断
方法:
1.先利用快慢指针找到该链表的中间结点
2.找到中间结点slow后,自slow开始将slow之后链表逆序,整合成一个新链表
3.将新链表与slow前面的链所形成的链表进行比对。当对比到最后一个元素时,所有元素都相同时返回true,否则false。

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        //解题思路:首先利用快慢指针方法得出链表的中间结点
        //将后半部分逆置
        //将一份为二的两个链表进行对比
      ListNode*fast=A;
      ListNode*slow=A;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        ListNode*pre=NULL;
        ListNode*pcur=slow;
        ListNode*pnext=NULL;
        while(pcur)
        {
            pnext=pcur->next;
            pcur->next=pre;
            pre=pcur;
            pcur=pnext;
        }
        while(pre!=NULL&&A!=NULL)
        {
            if(pre->val!=A->val)
            {
                return false;
            }
            pre=pre->next;
            A=A->next;
        }
        return true;
        
        
    }
};

希望大家越来越好吧(词穷了!!!)

以上是关于链表算法:合并两个有序链表将小于x的数据置于链表前部分链表的回文判断的主要内容,如果未能解决你的问题,请参考以下文章

LC 合并两个有序链表

leecode刷题(23)-- 合并两个有序链表

力扣21.合并两个有序链表

LeetCode21.合并两个有序链表

代码题(14)— 合并有序链表

力扣Leetcode 21. 合并两个有序链表