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

合并两个排序的链表

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

/*
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==nullptr||pHead2==nullptr)
		{
			return pHead1==nullptr?pHead2:pHead1;
		}
		else 
		{
			ListNode* L1,* L2,* s;
			ListNode* head;
			L1=pHead1;
			L2=pHead2;//双指针


			if(L1->val<L2->val)
			{
				s=L1;
				L1=L1->next;
			}
			else 
			{
				s=L2;
				L2=L2->next;
			}
			head=s;//以小的为起始


			while(L1!=nullptr||L2!=nullptr)//进行连接
			{
				if(L1==nullptr)
				{
					s->next=L2;
					L2=nullptr;
					break;
				}
				else if(L2==nullptr)
				{
					s->next=L1;
					L1=nullptr;
					break;
				}
				else 
				{
					if(L1->val<=L2->val)
					{
						s->next=L1;
						s=s->next;
						L1=L1->next;
					}
					else 
					{
						s->next=L2;
						s=s->next;
						L2=L2->next;
					}
				}

			}


			return head;	
		}
		
    }
};

此代码也适用于不等长链表合并

基本思路是设置游标L1在链表pHead1上移动,设置游标L2在链表pHead2上移动,s在合并链表head(为头)上移动

注意s在移动前必须先连接到除开已在pHead中结点外的最小结点上,当s到nullptr表明head已经连接完毕

如果制定以下规则

1.起始时L1,L2指向各自头结点,

2.当S移动到L1(L2时)L1(L2)向后移动一位,

那么在每次S即将连接下一个结点时,下一个结点必为L1,L2所指结点值较小的一个。

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务