单链表合并排序

来源:互联网 发布:数据挖掘 答案 韩家炜 编辑:程序博客网 时间:2024/06/16 10:06

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则

题目来源:牛客网

https://www.nowcoder.com/questionTerminal/d8b6b4358f774294a89de2a6ac4d9337


非递归思路

如果其中有一个链表为空,则返回另一个链表(包括两个都为空时,直接返回空)

创建两个指针,p 和 tail(其中tail用来表示p的尾)

访问两个链表的第一个首元素,将值最小的那个赋值给p和tail,然后较小的那个链表指针下移一位。

当两个链表同时不为空时,遍历两个两个链表,并作以下操作:

把两个链表中元素较小的那个节点链接到tail的后面,

        将该节点后移一位

        并将tail后移一位

当有剩余链表时,遍历剩余部分,并将其加入到tail的后面

整个合并排序结束,并且没有多余节点和链表生成。

/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};*/class Solution {public:    ListNode* Merge(ListNode* pHead1, ListNode* pHead2)    {        //判断是否为空        if(!pHead1)            return pHead2;        if(!pHead2)            return pHead1;                //借助两个新的指针,tail为p的尾        ListNode* p = NULL;        ListNode* tail = NULL;                //将两个链表中最小的首元素赋值给p和tail        if(pHead1->val >= pHead2->val)        {            p = tail = pHead2;            pHead2 = pHead2->next;        }else{            p = tail = pHead1;            pHead1 = pHead1->next;        }                //对两个链表进行遍历        while(pHead1 && pHead2)        {            //将当前两个链表中的最小值链接到tail的尾            if(pHead1->val >= pHead2->val)            {                tail->next = pHead2;                //将已经链接到tail后的节点指针下移一位                pHead2 = pHead2->next;            }else{                tail->next = pHead1;                pHead1 = pHead1->next;            }            //tail还是指向链表最尾端            tail = tail->next;        }                //对剩余的节点做处理(剩下的全部都插入尾端)        ListNode* t = pHead1?pHead1:pHead2;        while(t)        {            tail->next = t;            tail = tail->next;            t = t->next;        }        return p;    }};


原创粉丝点击