1.归并
具体代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode *head = new ListNode(-1); //临时头结点或伪头结点
ListNode *p = head;
while(l1 && l2){
if(l1 -> val < l2 -> val){
p -> next = l1;
l1 = l1 -> next;
}
else{
p -> next = l2;
l2 = l2 -> next;
}
p = p -> next;
}
if(l1) p -> next = l1;
if(l2) p -> next = l2;
return head -> next;
}
};
2.混洗后排序再连接
将两个链表中所有结点存入同一个优先级队列中(或者向量中然后排序),然后出队的同时将各个结点相连即可。
具体代码如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
struct cmp{
bool operator () (const ListNode *a, const ListNode *b){
return a -> val > b -> val;
}
};
ListNode* merge(ListNode* l1, ListNode* l2) {
if(!l1 && !l2) return NULL;
priority_queue<ListNode *, vector<ListNode *>, cmp> q;
while(l1){
q.push(l1);
l1 = l1 -> next;
}
while(l2){
q.push(l2);
l2 = l2 -> next;
}
ListNode *head = q.top(), *p;
p = head;
q.pop();
while(!q.empty()){
p -> next = q.top();
q.pop();
p = p -> next;
}
p -> next = NULL;
return head;
}
};