Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
第一种:将l2的内容往l1内插入,需要考虑下一节点,写的很乱,而且麻烦
//Definition for singly-linked list.
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*///第一种:将l2的内容往l1内插入,需要考虑下一节点,写的很乱,而且麻烦
class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
if(l1 == NULL)return l2;
if(l2 == NULL)return l1;
ListNode *p = l1;
ListNode *q = l2;
ListNode *head = l1;
if(l1->val > l2->val){
p = l2;
q = l1;
head = l2;
}
ListNode *pre = q;
while(p->next != NULL && q->next != NULL){
if((p->val == q->val) || (p->val < q->val && p->next->val > q->val)){
pre = q->next;
q->next = p->next;
p->next = q;
p = q;
q = pre;
}else{
p = p->next;
}
}
if(p->next == NULL){ p->next = q;return head;}
if(q->next == NULL){
while(p->next != NULL && p->val < q->val && p->next->val <= q->val){
p = p->next;
}
if(p->next == NULL){ p->next = q;return head;}
else{
q->next = p->next;
p->next = q;
}
}
return head;
}
};
//第二种,利用归并。高效,明了
/*
class Solution {
public:
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
if(l1 == NULL)return l2;
if(l2 == NULL)return l1;
ListNode *p = l1;
ListNode *q = l2;
ListNode *head = new ListNode(0);
ListNode *cur = head;
while(p && q){
if(p->val < q->val){
cur->next = p;
cur = p;
p = p->next;
cur->next = NULL;
}else{
cur->next = q;
cur = q;
q = q->next;
cur->next = NULL;
}
}
if (p)
cur->next = p;
else if (q)
cur->next = q;
return head->next;
}
};
*/