题解 | #链表合并#
链表合并
http://www.nowcoder.com/practice/46bda7f0570a47b6b54a29a0a6ae4c27
在实现常常遇到头节点初始化处理问题(创建新链表时可能遇到)
可以先假设一个初始化节点,在返回时将头节点指向下一个位置
using namespace std;
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){
}
};
ListNode* creatList(string s){
stringstream ss(s);
vector<int> v;
int x;
while(ss>>x){
v.push_back(x);
}
ListNode *head=new ListNode(v[0]),*r=head;//必须要给头节点赋予合适的初始值
for(int i=1;i<v.size();i++){
x=v[i];
ListNode *temp=new ListNode(x);
r->next=temp;
r=temp;
}
return head;
}
ListNode *mergeList(ListNode *h1,ListNode *h2){
if(!h1){
return h2;
}
if(!h2){
return h1;
}
ListNode *head=new ListNode(-1),*r=head;
while(h1&&h2){
int x;
if(h1->val<h2->val){
x=h1->val;
h1=h1->next;
}
else{
x=h2->val;
h2=h2->next;
}
ListNode *temp=new ListNode(x);
r->next=temp;
r=temp;
}
if(h1){
r->next=h1;
}
else{
r->next=h2;
}
head=head->next;//去掉初始化节点
return head;
}
int main(){
string s1,s2;
ListNode *h1,*h2,*head;
getline(cin, s1);
getline(cin, s2);
h1=creatList(s1);
h2=creatList(s2);
head=mergeList(h1, h2);
while(head){
cout<<head->val<<" ";
head=head->next;
}
return 0;
}