题解 | #合并两个排序的链表#

合并两个排序的链表

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

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
#include <cmath>
#include <linux/limits.h>
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        //典型的二路归并排序 
	  //给他一个头结点,这个结点不保存值
		ListNode* head = new ListNode(-1);
		head->next = nullptr;
		ListNode* ss = head;
		ListNode* p = pHead1;
		ListNode* q = pHead2;
		//排序直到有一个链表排完
	  //这里的时间复杂度依旧是O(MIN(ph1.len,ph2.len)),整个while只遍历最短的长度
		while(p != nullptr && q != nullptr)
		{
			//存放p链表
			if(p->val <= q->val)
			{
				while(p->next != nullptr && p->next->val <= q->val)
				{
					p = p->next;
				}
				ss->next = pHead1;
				ss = p;
				pHead1 = p->next;
				p = p->next;
				ss->next = nullptr;
				
			}
			//存放q链表
			else 
			{
				while(q->next != nullptr && q->next->val < p->val)
				{
					q = q->next;
				}
				ss->next = pHead2;
				ss = q;
				pHead2 = q->next;
				q = q->next;
				ss->next = nullptr;
				
			}
		}
	  //两个if将剩下的不为空的链表添加到ss的后面
		if(p != nullptr)
		{
			ss->next = pHead1;
		}
		if(q != nullptr)
		{
			ss->next = pHead2;
		}
		ss = head->next;
	  //销毁头结点
		delete head;
		return ss;
    }
};

全部评论

相关推荐

牛客83700679...:简历抄别人的,然后再投,有反馈就是简历不行,没反馈就是学历不行,多投多改只要技术不差机会总会有的
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
宇算唯航:目测实缴资本不超100W的小公司
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务