合并两个链表
时间限制: 1s
类别: DS:数组与链表->链表--较难
问题描述
给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。
请你将 list1 中下标从 a 到 b 的全部节点都删除,并将list2 接在被删除节点的位置。
下图中蓝色边和节点展示了操作后的结果:
请输出结果链表。
示例 1:
输入:list1 = [0,1,2,3,4,5], a = 3, b = 4, list2 = [1000000,1000001,1000002]
输出:[0,1,2,1000000,1000001,1000002,5]
解释:我们删除 list1 中下标为 3 和 4 的两个节点,并将 list2 接在该位置。上图中蓝色的边和节点为答案链表。
示例 2:
输入:list1 = [0,1,2,3,4,5,6], a = 2, b = 5, list2 = [1000000,1000001,1000002,1000003,1000004]
输出:[0,1,1000000,1000001,1000002,1000003,1000004,6]
解释:上图中蓝色的边和节点为答案链表。
输入说明
首先输入第一个链表长度n,然后输入n个整数,以空格分隔。
然后输入第二个链表长度m,然后输入m个整数,以空格分隔。
最后输入两个整数a 和 b
3<=n<=10^4
1<=m<=10^4
1<=a<=b<n
输出说明
输出格式见范例。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode() : val(0), next(NULL) {}
ListNode(int x) : val(x), next(NULL) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
ListNode *createByTail()
{
ListNode *head;
ListNode *p1,*p2;
int n=0,num;
int len;
cin>>len;
head=NULL;
while(n<len && cin>>num)
{
p1=new ListNode(num);
n=n+1;
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
}
return head;
}
ListNode* MergeTwo(ListNode* A, ListNode* B)
{
if (!B) return A; // 濡傛灉B涓虹┖锛屽垯涓嶉渶瑕佸悎骞讹紝鐩存帴杩斿洖A
int m, n;
cin >> m >> n; // 杈撳叆鍒犻櫎鐨勪綅缃寖鍥�
ListNode dummy(0, A); // 浣跨敤铏氭嫙澶磋妭鐐圭畝鍖栨搷浣�
ListNode *before = &dummy;
for(int i = 0; i < m; ++i)
before = before->next; // 绉诲姩鍒板垹闄ゅ尯闂寸殑鍓嶄竴涓妭鐐�
ListNode *after = before;
for(int i = m; i <= n+1; ++i && after)
{
after = after->next; // 绉诲姩鍒板垹闄ゅ尯闂寸殑鏈�鍚庝竴涓妭鐐圭殑涓嬩竴涓妭鐐�
}
// 鍒犻櫎鎸囧畾鍖洪棿鐨勮妭鐐�
ListNode *temp;
while(before->next != after)
{
temp = before->next;
before->next = temp->next;
delete temp;
}
// 灏咮閾捐〃鎻掑叆
ListNode *tailB = B;
while(tailB->next) // 鎵惧埌B閾捐〃鐨勫熬閮�
tailB = tailB->next;
before->next = B; // 鍦ˋ閾捐〃涓殑鍚堥�備綅缃彃鍏閾捐〃
tailB->next = after; // 灏咮閾捐〃鐨勫熬閮ㄨ繛鎺ュ埌after锛屽畬鎴愬悎骞�
return dummy.next; // 鐢变簬浣跨敤浜嗚櫄鎷熷ご鑺傜偣锛岃繑鍥瀌ummy.next鍗充负鍚堝苟鍚庣殑閾捐〃澶磋妭鐐�
}
void printList(ListNode* head)
{
if (!head)
{
cout << "head-->tail" << endl;
return;
}
cout << "head";
while (head)
{
cout << "-->" << head->val;
head = head->next;
}
cout << "-->tail" << endl;
}
int main()
{
ListNode*A=createByTail();
ListNode*B=createByTail();
A=MergeTwo(A,B);
printList(A);
return 0;
}