题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
思路:
- 判断空
- 头节点需要判断,
- 然后让头节点一个一个吞噬链表。
比较麻烦
/*
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==NULL||pHead2==NULL)
return pHead1==NULL?pHead2:pHead1;
ListNode* tmp1=pHead1;
ListNode* tmp2=pHead2;
ListNode* front(0);
ListNode* refront(0);
if(tmp1->val>tmp2->val){
front=tmp2;
refront=front;
tmp2=tmp2->next;
}else{
front=tmp1;
refront=front;
tmp1=tmp1->next;
}
while(tmp1!=NULL&&tmp2!=NULL)
{
if(tmp1->val>tmp2->val){
ListNode* tmp=tmp2;
tmp2=tmp2->next;
front->next=tmp;
front=front->next;
}else{
ListNode* tmp=tmp1;
tmp1=tmp1->next;
front->next=tmp;
front=front->next;
}
}
while(tmp1!=NULL){
front->next=tmp1;
tmp1=tmp1->next;
}
while(tmp2!=NULL){
front->next=tmp2;
tmp2=tmp2->next;
}
return refront;
}
};
剑指offer解法:
递归的解法比较好用
/*
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==NULL)
return pHead2;
else if(pHead2==NULL)
return pHead1;
ListNode* tmp(0);
if(pHead1->val>pHead2->val)
{
tmp=pHead2;
tmp->next=Merge(pHead1,pHead2->next);
}else{
tmp=pHead1;
tmp->next=Merge(pHead1->next,pHead2);
}
return tmp;
}
};
JAVA解法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null){
return l2;
}
if(l2 == null){
return l1;
}
ListNode head = null;
ListNode pre = null;
if(l1.val <= l2.val){
head = l1;
pre = l1;
l1 = l1.next;
}else{
head = l2;
pre = l2;
l2 = l2.next;
}
while(l1 != null && l2 != null){
if(l1.val < l2.val){
pre.next = l1;
l1 = l1.next;
}else{
pre.next = l2;
l2 = l2.next;
}
pre = pre.next;
}
while(l1 != null){
pre.next = l1;
pre = pre.next;
l1 = l1.next;
}
while(l2 != null){
pre.next = l2;
pre = pre.next;
l2 = l2.next;
}
return head;
}
}